分析:
题目要求写一个函数,将递增链表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