1.有序链表的合并
Posted clclcl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1.有序链表的合并相关的知识,希望对你有一定的参考价值。
题目:已知单链表A,单链表B均为单调不减有序链表,请你写出一个函数将这两个单链表合并成一个新的有序链表C。
根据链表中结点的组成,很容易想到,此时无需再为C分配内存,只需使C的head指向A或B的head,再改变链表A,B中的指针域的值,使A和B按照顺序被“串”起来即可。
如图这个例子,充分说明了为何无需再分配空间:
有了这个大概思路,我们想一下该如何代码实现
1.需要三个指针a,b,c,分别指向A,B待判断大小的结点和C的末尾。先进行a,b所含值的大小判断,再将较小的链接到C末尾。
2.确定C的head指向A,B中较小的一方。(???)
3.为了缩减时间,需要判断是否有一个表的元素已经合并完,若有的话,只需将另一个表的剩余段链接在c所指的结点之后即可。
大家可以先自己写一写再来看我的思路,欢迎评论交流。
函数体如下:
1 void MergeList_L(List*a,List*b,List*c){ 2 //已知传入的两个链表均为非递减序 3 //使合并成的C链表也为非递减序 4 Node*A=a->head; 5 Node*B=b->head; 6 if (A->value>=B->value) { 7 c->head=b->head; 8 B=B->next; 9 } 10 else{ 11 c->head=a->head; 12 A=A->next; 13 } 14 //make sure C‘s header is the smaller one of A and B 15 Node*C=c->head; 16 17 while (A&&B) { 18 if (A->value>=B->value) { 19 C->next=B;B=B->next; 20 } 21 else{ 22 C->next=A;A=A->next; 23 } 24 C=C->next; 25 }//进行链接,并判断有无链表被归并完 26 C->next=A?A:B; 27 28 }
再附上头文件
typedef struct _node{ int value; struct _node *next; }Node; typedef struct _list{ Node* head; }List;
以上是关于1.有序链表的合并的主要内容,如果未能解决你的问题,请参考以下文章