两个有序链表序列的合并
Posted 夏梦清荷
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两个有序链表序列的合并相关的知识,希望对你有一定的参考价值。
7-51 两个有序链表序列的合并(20 分)
已知两个非降序链表序列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
作者: DS课程组
单位: 浙江大学
时间限制: 1500ms
内存限制: 128MB
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 typedef struct LNode{ 5 int data; 6 struct LNode *next; 7 }LNode,*LinkList; 8 9 void init(LinkList &L); 10 void read(LinkList &L); 11 void merge(LinkList La,LinkList Lb,LinkList &Lc); 12 void print(LinkList L); 13 14 int main(){ 15 LinkList la,lb,lc; 16 init(la); 17 init(lb); 18 init(lc); 19 read(la); 20 read(lb); 21 merge(la,lb,lc); 22 print(lc); 23 return 0; 24 } 25 26 27 void init(LinkList &L){ 28 L=(LinkList)malloc(sizeof(LNode)); 29 L->next = NULL; 30 } 31 void read(LinkList &L){ 32 LinkList p,tem; 33 int e; 34 tem=L; 35 36 scanf("%d",&e); 37 while(e>0){ 38 p=(LinkList)malloc(sizeof(LNode)); 39 p->data=e; 40 p->next=NULL; 41 tem->next=p; 42 tem=p; 43 scanf("%d",&e); 44 } 45 } 46 47 void print(LinkList L){ 48 LinkList p=L->next; 49 if(!p){ 50 printf("NULL"); 51 } 52 else{ 53 printf("%d",p->data); 54 p=p->next; 55 while(p){ 56 printf(" %d",p->data); 57 p=p->next; 58 } 59 } 60 } 61 62 void merge(LinkList La,LinkList Lb,LinkList &Lc){ 63 LinkList pa,pb,pc; 64 pa=La->next;pb=Lb->next; 65 Lc=pc=La; 66 while(pa&&pb){ 67 if(pa->data<=pb->data){ 68 pc->next=pa; 69 pc=pa; 70 pa=pa->next; 71 } 72 else{ 73 pc->next=pb; 74 pc=pb; 75 pb=pb->next; 76 } 77 } 78 pc->next=pa?pa:pb; 79 free(Lb); 80 }
总结:
这一题是第一次体验运用刚学的数据结构来刷算法题,平时的题目只是要求我们做出特定功能的算法的函数就行,而OJ题需要我们写出能运行的代码,就需要有 main函数、数据结构定义,函数声明及定义,缺一不可。
这一题需要注意的地方是‘read函数和输出格式’,其他诸如初始化操作、链表合并操作都是约定俗成的。read函数需要一次性读入所有值放到链表中,并遇到-1停止,因为这一题输入的都是正整数,就可以通过是否>0来确定是否输入完毕,该函数中循环的地方还要格外注意。输出格式问题是,若为空,输出NULL,所以单独列出这种可能性的操作;若不为空,合并后的链表各结点的值需用空格隔开,但最后一个元素后面没有空格,我的方法是先单独输出第一个结点的值,再按“空格+值”的格式输出。
以上是关于两个有序链表序列的合并的主要内容,如果未能解决你的问题,请参考以下文章