两个有序链表序列的合并

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,所以单独列出这种可能性的操作;若不为空,合并后的链表各结点的值需用空格隔开,但最后一个元素后面没有空格,我的方法是先单独输出第一个结点的值,再按“空格+值”的格式输出。

 

以上是关于两个有序链表序列的合并的主要内容,如果未能解决你的问题,请参考以下文章

两个有序链表序列的合并

PTA 两个有序链表序列的合并

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

02-线性结构1 两个有序链表序列的合并

两个有序链表序列的合并

02-线性结构1 两个有序链表序列的合并