码迷,mamicode.com
首页 > 其他好文 > 详细

1.有序链表的合并

时间:2018-10-28 14:56:53      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:amp   思路   ext   改变   代码实现   int   src   com   实现   

题目:已知单链表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.有序链表的合并

标签:amp   思路   ext   改变   代码实现   int   src   com   实现   

原文地址:https://www.cnblogs.com/clclcl/p/9865470.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!