好久前就看到这道题了...然而上一次想写的时候没什么思路就放弃了...最近突然有了点idea就把它肝出来了orz
23 | Merge k Sorted Lists | 26.4% | Hard |
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
其实仔细一想,其实这道题的真谛其实就是mergesort算法的后半部分(不就是把排好序的数列合成一个数列嘛)...亏我想了那么久
我的想法是把mergeKLists函数运用递归的思想把1个存着k个排好序的数列的vector拆成2个k/2的数列的vector,然后再分别对这两个vector使用mergeKSorted函数,这样依次下去最终会得到一个只含有两个数列的vector,这样就可以使用merge函数对两个数列进行sort了。
如果不运用递归的话,每一个数列去遍历的话,复杂度可能会很大,大概会达到O(n3)但是用了递归的话,每一次merge函数的复杂度是O(n),对mergeKLists函数来说,其时间复杂度跟归并算法一样都是O(nlog n),大大减少了时间复杂度
当然,空间复杂度肯定会比没使用递归函数的空间复杂度大,这也是没办法的事orz
上代码吧
ListNode* merge(ListNode* l1,ListNode* l2)
{
if(l1==NULL)
{
return l2;
}
else if(l2==NULL)
{
return l1;
}
if(l1->val <= l2->val)
{
l1->next = merge(l1->next, l2);
return l1;
}
else
{
l2->next = merge(l1, l2->next);
return l2;
}
}
ListNode* mergeKLists(vector<ListNode*>& lists)
{
int size=lists.size();
if(size==0)
{
return NULL;
}
else if(size==1)
{
return lists[0];
}
else if(size==2)
{
return merge(lists[0],lists[1]);
}
else
{
vector<ListNode*> list1;
vector<ListNode*> list2;
for(int i=0;i<size/2;i++)
{
list1.push_back(lists[i]);
}
for(int i=size/2;i<size;i++)
{
list2.push_back(lists[i]);
}
ListNode* i1=mergeKLists(list1);
ListNode* i2=mergeKLists(list2);
return merge(i1,i2);
}
}