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.有序链表的合并的主要内容,如果未能解决你的问题,请参考以下文章

1.有序链表的合并

两个有序链表的合并

合并两个有序链表【递归、迭代】

代码题(14)— 合并有序链表

两个有序链表的合并

合并两个有序链表--力扣