Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
思路是二分法。这样似乎可以降低一些复杂度(存疑)。分析见:
http://blog.unieagle.net/2012/10/05/leetcode%E9%A2%98%E7%9B%AE%EF%BC%9Amerge-k-sorted-lists/
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *mergeTwoLists(ListNode* headA, ListNode* headB){
ListNode* vHead = new ListNode(-1);
ListNode* tmp = vHead;
ListNode* tmpA = headA;
ListNode* tmpB = headB;
while(tmpA && tmpB)
{
if(tmpA->val<=tmpB->val)
{
tmp->next = tmpA;
tmpA = tmpA->next;
}
else
{
tmp->next = tmpB;
tmpB = tmpB->next;
}
tmp = tmp->next;
}
while(tmpA)
{
tmp->next = tmpA;
tmp = tmp->next;
tmpA = tmpA->next;
}
while(tmpB)
{
tmp->next = tmpB;
tmp = tmp->next;
tmpB = tmpB->next;
}
if(!vHead->next) return NULL;
return vHead->next;
}
ListNode *mergeKLists(vector<ListNode *> &lists) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int listCount = lists.size();
if(listCount==0) return NULL;
while(listCount>1)
{
int halfCount = (listCount+1)/2;
for(int i=0;i<halfCount && i+halfCount<listCount; i++)
{
ListNode* first = lists[i];
ListNode* second = lists[i+halfCount];
ListNode* result = mergeTwoLists(first,second);
lists[i] = result;
}
listCount = halfCount;
}
return lists[0];
}
};