算法思路
1.先写一个两两合并的方法
2.然后遍历为所有链表并合并,当然这里需要稍微区分下链表数是奇数还是偶数。
//编写合并两个链表的函数
struct ListNode* mergTwoList( ListNode* list1, ListNode* list2){
//p始终指向两个链表中较小的结点
struct ListNode* p = list1->val <= list2->val ? list1 : list2;
struct ListNode* q = list2->val <= list2->val ? list2 : list1;
用ret指针指向结果链表
struct ListNode* ret = p;
//利用p q同时遍历两条链表当p所指结点值较小的时候,p直接后移,当p所指结点较小的时候需要改动指针来合并得到一个有序链表
while( p && q){
struct ListNode* temp =NULL;
if(p->next && p->next->val <= q->val){
p = p->next;
}else{
//用temp 来保存p的后继。防止断链
temp = p->next;
//修改p所指结点,由于q结点较小,因此p->next应该指向较小的结点,也就是q所指结点。
p->next = q ;
//p指向较小结点
p = q;
//q指向较大的结点
q = temp;
}
}
return ret;
}
//现在利用归并,将k个链表,两两相连。
struct ListNode* mergeLists(ListNode** lists, int listLen){
//由于
struct ListNode* temp;
struct ListNode* arr[listsLen];
int li = 0;
int flag = 0;
//循环操作直至链表集合合成了一个链表
while (listsLen > 1) {
if (listsLen % 2 != 0) {
//当链表集合为偶数个链表的时候,一趟能刚好两两合并。
//当为奇数个数的时候,一趟的时候会剩下最后一个链表没有合并,将这个链表保存在temp指针中。
temp = lists[listsLen - 1];
listsLen--;
flag = 1;
} else
flag = 0;
//从做往右两两合并,
for (int i = 0; i < listsLen; i += 2) {
lists[li] = mergeTwoList(lists[i], lists[i + 1]);
//新链表长度为li
li += 1;
}
if (flag == 1) {
lists[li] = temp;
li += 1;
}
//一趟完成后重新设置链表集合长度
listsLen = li;
li = 0;
}
return lists[0];
}
本文介绍了一种高效的算法,用于合并多个已排序的链表。该算法首先定义了一个两两合并链表的方法,然后通过递归的方式将所有链表进行两两合并,最终得到一个完全排序的链表。

514

被折叠的 条评论
为什么被折叠?



