Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
二分法可以降低复杂度。一遍通过,耶~
/**
* 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) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(lists.size()==0) return NULL;
int size = lists.size();
while(size>1)
{
int halfSize = (1+size)/2;
for(int i=0;i<halfSize && halfSize+i<size;i++) //重要!
{
ListNode *l1 = lists[i];
ListNode *l2 = lists[i+halfSize];
ListNode *result = mergeTwoLists(l1,l2);
lists[i] = result;
}
size = halfSize;
}
return lists[0];
}
ListNode *mergeTwoLists(ListNode* list1,ListNode* list2)
{
ListNode* tmp1 = list1;
ListNode* tmp2 = list2;
ListNode* vHead = new ListNode(0);
ListNode* tmp = vHead;
while(tmp1&&tmp2)
{
if(tmp1->val<tmp2->val)
{
tmp->next = tmp1;
tmp1 = tmp1->next;
}
else
{
tmp->next = tmp2;
tmp2 = tmp2->next;
}
tmp = tmp->next;
}
while(tmp1)
{
tmp->next = tmp1;
tmp1 = tmp1->next;
tmp = tmp->next;
}
while(tmp2)
{
tmp->next = tmp2;
tmp2 = tmp2->next;
tmp = tmp->next;
}
return vHead->next;
}
};