已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。

输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。

输出格式:
在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。

输入样例:
1 3 5 -1
2 4 6 8 10 -1
输出样例:
1 2 3 4 5 6 8 10

第一次链表的实现。之前看链表,啥空表头的链表,双向,循环链表,感觉会,然后实现才发现,有点难呀。
第一次写的错误代码,超时了。

#include<stdio.h>
#include<stdlib.h>
struct Node
{int dat;struct Node *pre;struct Node *next;
};
typedef struct Node node;
node *headl;
node *make_new_node(node *head,int data)
{node *p,*tep=head;p=(node*)malloc(sizeof(node));if(p==NULL){exit(0);}if(head==NULL)//first node{head=p;head->dat=data; head->pre=NULL;head->next=NULL;}else{tep=head;while(tep->next!=NULL){tep=tep->next;}**这里可以优化**tep->next=p;p->dat=data;p->pre=tep;p->next=NULL;}return head;
}
int get_merge(node *head1,node *head2)
{node *pos1,*pos2;//here,we put head1 as a new node's first head;if(head1==NULL&&head2==NULL){return 0;//输出null;}if(head1==NULL||head2==NULL){return 1;//只需输出一个链表的值}int t1=head1->dat,t2=head2->dat;**下面判断这么复杂,就是因为最后一个节点的null,无法有效的解决**if(t1>t2){headl=head2;while(1){t1=head1->dat,t2=head2->dat;if(t1>t2){if(head2->next==NULL){head2->next=head1;break;}elsehead2=head2->next;}else if(t1<t2){pos2=head1->next;head2->pre->next=head1;head1->next=head2;head1=pos2;}else {pos1=head1->next;pos2=head2->next;head1->next=head2;head2->next=pos1;head2=pos2;if(head1==NULL) break;}}}else{headl=head1;while(1){t1=head1->dat,t2=head2->dat;if(t2>t1){if(head1->next==NULL){head1->next=head2;break;}elsehead1=head1->next;}else if(t2<t1){pos2=head2->next;head1->pre->next=head2;head2->next=head1;head2=pos2;}else {pos1=head1->next;pos2=head2->next;head1->next=head2;head2->next=pos1;head2=pos2;if(head2==NULL) break;}}}return 2;
}
void dis_link(node *head)
{node *p=head,*pr;while(p->next!=NULL){printf("%d ",p->dat);p=p->next;}printf("%d\n",p->dat);
}
void free_node(node *head)
{node *p;node *pr=head;while(pr->next!=NULL){p=pr->next;free(pr);pr=p;}free(pr);
}
int main(void)
{node *head1=NULL,*head2=NULL;int data;while(scanf("%d",&data)&&data!=-1){head1=make_new_node(head1,data);}while(scanf("%d",&data)&&data!=-1){head2=make_new_node(head2,data);}int flag=get_merge(head1,head2);if(flag==1){if(head1==NULL){dis_link(head2);free_node(head2);}else {dis_link(head1);free_node(head1);}}else if(flag==0){printf("NULL\n");}else{dis_link(headl);free_node(headl);}return 0;
}

带了空头结点简单多了

#include<stdio.h>
#include<stdlib.h>
struct Node
{int dat;struct Node *next;
};
typedef struct Node node;
node *headp;
node *make_new_node(node *head)
{
**这里改为只建立一个空头结点**node *p;p=(node*)malloc(sizeof(node));head=p;p->next=NULL;return head;
}
int get_merge(node *head1,node *head2)
{node *pos1,*pos2,*headl;if(head1->next==NULL&&head2->next==NULL){return 0;//输出null;}if(head1->next==NULL||head2->next==NULL){return 1;//只需输出一个链表的值}pos1=(node*)malloc(sizeof(node));headl=pos1;headp=headl;**开始以为空头结点不需要开空间**head1=head1->next;head2=head2->next;**这里的空头结点很有用。**while(head1&&head2){if(head1->dat<head2->dat){headl->next=head1;head1=head1->next;}else{headl->next=head2;head2=head2->next;}headl=headl->next;}if(!head1&&!head2) return 2;if(head1!=NULL){headl->next=head1;}if(head2!=NULL){headl->next=head2;}return 2;
}
void dis_link(node *head)
{node *p=head->next,*pr;while(p->next!=NULL){printf("%d ",p->dat);p=p->next;}printf("%d\n",p->dat);
}
void free_node(node *head)
{node *p;node *pr=head;while(pr->next!=NULL){p=pr->next;free(pr);pr=p;}free(pr);
}
int main(void)
{node *head1=NULL,*head2=NULL;head1=make_new_node(head1);head2=make_new_node(head2);int data;node *ll=head1;while(scanf("%d",&data),data!=-1){node *tep;tep=(node*)malloc(sizeof(node));ll->next=tep;tep->next=NULL;tep->dat=data;ll=tep;**这里就是上面的优化,不需要移动头结点去添加新的节点了**}ll=head2;while(scanf("%d",&data),data!=-1){node *tep;tep=(node*)malloc(sizeof(node));ll->next=tep;tep->next=NULL;tep->dat=data;ll=tep;}int flag=get_merge(head1,head2);if(flag==1){if(head1==NULL){dis_link(head2);free_node(head2);}else{dis_link(head1);free_node(head1);}}else if(flag==0){printf("NULL\n");free_node(head1);free_node(head2);}else{dis_link(headp);free_node(headp);}return 0;
}

收获:讲得好不如做得好,代码自己实现起来,能够加深印象。
链表不同于数组,如果此题用数组,开三个。而链表开两个链表,然后在开一个控表头,把其他的数据块链接到空表头后面即可。不需要再开空间

pta 7-3 两个有序链表序列的合并 (20 分)相关推荐

  1. 7-174 两个有序链表序列的合并 (20 分)

    7-174 两个有序链表序列的合并 (20 分) 已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3. 输入格式: 输入分两行,分别在每行给出由若干个正整数构成的非降 ...

  2. 7-51 两个有序链表序列的合并 (20 分)(vector做法)

    一 :题目 .已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3. 输入格式: 输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不 ...

  3. 7-5 两个有序链表序列的合并 (20 分)

    已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3. 输入格式: 输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列) ...

  4. 习题2.5 两个有序链表序列的合并 (15 分)

    习题2.5 两个有序链表序列的合并 (15 分) 本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列. 函数接口定义: List Merge( List L1, List L ...

  5. 7-1 两个有序链表序列的合并 (15 分)

    ** 7-1 两个有序链表序列的合并 (15 分) ** 已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3. 输入格式: 输入分两行,分别在每行给出由若干个正整数构 ...

  6. 7-3 两个有序链表序列的合并 (15 分)

    7-3 两个有序链表序列的合并 (15 分) #include <stdio.h> #include <stdlib.h> typedef int ElementType; t ...

  7. 7-52 两个有序链表序列的交集 (20 分)(思路加详解尾插法)come Boby!

    一:题目 已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3. 输入格式: 输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列) ...

  8. 两个有序链表序列的交集 (20分)(最佳解法)

    题目描述: 已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3. 输入格式: 输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列 ...

  9. 两个有序链表序列的合并编程

    7-51 两个有序链表序列的合并 (20 分) 已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3. 输入格式: 输入分两行,分别在每行给出由若干个正整数构成的非降序 ...

  10. 6-3 两个有序链表序列的合并

    6-3 两个有序链表序列的合并 (15 分) 本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列. 函数接口定义: List Merge( List L1, List L2 ...

最新文章

  1. 【面试必备】透过源码角度一步一步带你分析 ArrayList 扩容机制
  2. vertrigoserv mysql 密码_VertrigoServ
  3. keras 时间序列分析
  4. [html] 请实现一个网站加载进度条
  5. kotlin 判断数字_Kotlin程序可以逆转数字
  6. linux vps 迁移数据 ip screen ctrl a d,Linux学习笔记之screen命令的使用
  7. 数论基本定理及应用(四)
  8. 连续区间(数据岛)查询
  9. oracle 批量生成约束,关于sql脚本导入Oracle时重复生成check约束的问题解决
  10. 博达路由器常见功能教学0
  11. dateutil模块
  12. idea mvn命令
  13. 5G NR 下行同步SSB(3)-- PBCH/MIB的用途
  14. Python 标准库之 random 生成伪随机数『详细』
  15. 二代身份证读取 中控ID180 二三代身份证阅读器 Vue版本
  16. launch计算机上哪个初中,这位妈妈10年夏校经验告诉你:小学初中高中都该如何选择夏校?...
  17. 《数据库原理》实验六 SQL数据查询实验
  18. EasyExcel 批量添加批注
  19. 怎么在添加为知笔记编辑器/为知笔记怎么用其他编辑器编辑/为知笔记怎么才能用Word/notepad++编辑
  20. 【生产调度】基于遗传算法求解柔性生产调度(FJSP)问题含Matlab源码

热门文章

  1. kvm安装及虚拟机创建
  2. 《ANSYS 14.0超级学习手册》一第2章 高级应用的基石——APDL
  3. 学习SQLite之路(五) C/C++ SQLite开发实例
  4. Linux运维人员成长之路学习书籍推荐
  5. 桌面虚拟化之呼叫中心语音应用
  6. Winform/WPF实例中的相互操作
  7. FreeTextBox License机制的粗浅分析
  8. 2007.04.26
  9. 博客堂也遇DotText经典Exception
  10. java获取下一季末_java取当前周期、月初至月末、季度初至季度末日期。