题目:
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
思路:
实现方法其实和普通的归并排序差不多,最大的区别是这里我们每一次合并只需要处理两个链表就行了。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.size()==0)return 0;
mergelist(lists,0,lists.size());
return lists[0];
}
void mergelist(vector<ListNode*>& lists,int l,int r)
{
if(r-l<2)return;
auto mid=l+(r-l)/2;
mergelist(lists,l,mid);
mergelist(lists,mid,r);
lists[l]=mergeTwoLists(lists[l],lists[mid]);
}
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(l1==0)return l2;
if(l2==0)return l1;
auto res=l1;
ListNode* pre=0;
while(l1&&l2)
{
if(l1->val>=l2->val)
{
if(pre)
{
auto temp=l2->next;
pre->next=l2;
l2->next=l1;
pre=l2;
l2=temp;
}
else
{
auto temp=l2->next;
l2->next=l1;
pre=l2;
res=l2;
l2=temp;
}
}
else
{
pre=l1;
l1=l1->next;
}
}
if(l2) pre->next=l2;
return res;
}
};