分析:
- 题目要求写一个函数,将递增链表L1和L2合并为一个非递减函数
- 比较两链表的首结点,选其中最小值放入有序链表中,然后将剩下的值和最小值的下一个结点值比较
- 重复2,直到有一条链表的所有结点都已排序
- 将另外一条链表的剩余结点全部接上
思路:
- 创建一个结点,作为最终链表的头结点
- 再创建三个结点指针,分别指向已排序链表的尾结点,链表L1,L2的未排序部分的首结点
- 根据分析2,3,4写入代码
代码如下
List Merge( List L1, List L2 ) {
List s = (List)malloc(sizeof(struct Node)); //把s作为最终返回链表的头结点
List r = s, r1 = L1->Next, r2 = L2->Next; //r始终指向有序部分的尾结点,r1 r2 指向链表L1 L2中未排序的首结点
while(r1 && r2) { //其中一个链表元素已全部排序
if(r1->Data <= r2->Data) {
r->Next = r1; r = r1; r1 = r1->Next;
}
else {
r->Next = r2; r = r2; r2 = r2->Next;
}
}
r->Next = r1? r1 : r2;
L1->Next = NULL; L2->Next = NULL;
return s;
}
注意:
- 仔细看题,题目说了L1和L2都是带头结点的单链表,所以它们要排序的结点是从头结点的下一个结点开始
- 返回的也是最终链表的头结点…
- 输入输出样例表明,排序后L1和L2只剩一个头结点,所以最后应该把它们的下一个结点置为NULL