题目:
Merge k sorted
linked lists and return it as one sorted list. Analyze and describe its complexity.
思路1:
1.采用分治的方法,对k个lists进行划分成两半,然后继续划分,直到只剩下两个lists,将其合并起来,然后再回溯回来;
2.合并方法即Merge Two Sorted Lists;
3.该算法时间复杂度为O(nklogk),空间复杂度为递归栈的大小O(logk)
代码1:
class Solution{
public:
ListNode *mergeKLists(vector<ListNode *> &lists)
{
if(!lists.size()) return NULL;
return process(lists,0,lists.size()-1);
}
private:
ListNode *process(vector<ListNode *> &lists,int left,int right)
{
if(left<right)
{
int mid=(left+right)/2;
return mergeTwoLists(process(lists,left,mid),process(lists,mid+1,right));
}
return lists[left];
}
ListNode *mergeTwoLists(ListNode *l1,ListNode *l2)
{
ListNode *head=new ListNode(-1);
ListNode *tail=head,*p1=l1,*p2=l2;
while(p1 && p2)
{
if(p1->val<=p2->val)
{
tail->next=p1;
p1=p1->next;
}
else
{
tail->next=p2;
p2=p2->next;
}
tail=tail->next;
}
tail->next=!p1?p2:p1;
return head->next;
}
};
思路2:
1.使用堆