/*
23. Merge k Sorted Lists My Submissions QuestionEditorial Solution
Total Accepted: 82416 Total Submissions: 354043 Difficulty: Hard
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
Subscribe to see which companies asked this question
*/
/*
解题思路:
采用二路归并的方法
先两两结合进行合并把结果放到前一个链表指针的位置。一趟之后,指针数组会减少一半成为n/2,然后再对这n/2链表进行合并,依次这样下去,知道最后链表指针个数为1即为我们所要的结果。
注意:在两个链表合并的时候,若要合并的是同一个链表,则直接返回不需要做合并。
*/
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
//合并两个已经排好序的链表
ListNode* mergeTwoLists(ListNode* l1,ListNode* l2){
if(l1==l2)return l1;
if(l1==NULL)return l2;
if(l2==NULL)return l1;
ListNode* dummy=new ListNode(-1);
ListNode* p=dummy;
while(l1&&l2){
if(l1->val<l2->val){
p->next=l1;
l1=l1->next;
}
else{
p->next=l2;
l2=l2->next;
}
p=p->next;
}
if(l1)p->next=l1;
if(l2)p->next=l2;
return dummy->next;
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.empty())return NULL;
while(lists.size()>1){
int left=0,right=lists.size()-1;
while(left<=right){
lists[left]=mergeTwoLists(lists[left],lists[right]);
++left;
--right;
}
lists.resize(left);
}
return lists[0];
}
};