您的位置:首页 > 其它

[LeetCode]Merge k Sorted Lists

2017-03-10 17:02 309 查看
好久前就看到这道题了...然而上一次想写的时候没什么思路就放弃了...最近突然有了点idea就把它肝出来了orz

23Merge k Sorted Lists26.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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: