Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
Example:
Input: [ 1->4->5, 1->3->4, 2->6 ] Output: 1->1->2->3->4->4->5->6
分析:
一开始想的是k路归并,后来仔细一想,k路归并会多很多没必要的判断,直接使用merge相邻的两个链表就好了。这里有个技巧,
归并的时候,一种是遍历归并,即链表0不断和1,2,3,4,...,的链表归并,随着归并的数量增加,链表0会变得越来越长,效率也会越来越低。比较好的方法是,0和1归并,2和3,4和5,...,这样一直循环到只剩下最后一个链表,这种方法避免了归并的时候链表0越来越长导致的效率下降。
下面实现的时候借鉴了LeetCode答案区的答案,即第0个链表和最后一个链表归并,第1个和倒数第二个归并,看代码就好
代码:
/**
* 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.empty())
return 0;
if(lists.size()%2!=0)
lists.push_back(0);
int begin = 0, end = lists.size()-1;
while(end>0)
{
begin=0;
while(begin<end)
{
lists[begin]=Merge2List(lists[begin], lists[end]);
++begin;
--end;
}
}
return lists[0];
}
ListNode* Merge2List(ListNode* l1, ListNode* l2)
{
if(l1==NULL)
return l2;
if(l2==NULL)
return l1;
if(l1==l2)
return l1;
ListNode* head;
if(l1->val<l2->val)
head=l1,l1=l1->next;
else
head=l2, l2=l2->next;
ListNode* node=head;
while(l1&&l2)
{
if(l1->val<=l2->val)
{
node->next=l1;
l1=l1->next;
}
else
{
node->next=l2;
l2=l2->next;
}
node=node->next;
}
node->next=NULL;
if(l1)
node->next=l1;
if(l2)
node->next=l2;
return head;
}
};