您的位置:首页 > 其它

【Leetcode】之Merge k Sorted Lists

2015-11-13 10:55 218 查看

一.问题描述

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

二.我的解题思路

之前是做过merge 2 sorted list的题目,所以拿到这个题目,很自然的想法就是采用分治递归法,将原问题转换成多个merfe 2的问题求解。但是结果超时了,这种分治再合并的算法的时间复杂度是O(2n+3n+…+kn)=O(nk²),

接下来就是思考优化。遗憾的是,我自己的思维局限在了如何利用merge 2的结果,最大限度减少merge的耗时上,想了一会没有想到太好的思路。

上网查阅资料,发现别人是用排序问题的思路来解决这个问题。首先取k个链表的头元素,求取最小的元素,将其设为结果链表的头结点。然后维护一个最小堆结构,这种做法的复杂度是O(n*k*logk),测试通过的程序如下:

/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/

#define LN ListNode*
#define HEAP heap.begin(),heap.end()
#define PB push_back
#define INF 1000000

struct node
{
int val;
LN from;

node(ListNode* n)
{
if ( n==NULL )
{
val=INF;
}
else
{
val=n->val;
}
from=n;
}
bool operator<(const node& other)const
{
return val<other.val;
}
bool operator>(const node& other)const
{
return val>other.val;
}
};

class Solution {
public:
ListNode *mergeKLists(vector<ListNode *> &lists) {
// Start typing your C/C++ solution below
// DO NOT write int main() function

if (lists.empty()) return NULL;
int n= lists.size();
vector<node> heap;
heap.reserve(n);
for( int i=0;i<n;i++)
heap.PB(node(lists[i]));
make_heap(HEAP,greater<node>());
LN head= new ListNode(0);
LN pL = head;
pop_heap(HEAP,greater<node>());
node small=heap.back();
heap.pop_back();
while(small.val!=INF)
{
LN next=small.from->next;
pL->next=small.from;
small.from->next=NULL;
pL=pL->next;

heap.PB(node(next));
push_heap(HEAP,greater<node>());
pop_heap(HEAP,greater<node>());
small=heap.back();
heap.pop_back();
}

LN ret=head->next;
delete head;
return ret;    }
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: