# 23. Merge k Sorted Lists

372人阅读 评论(0)

1、2合并，遍历2n个节点。

12结果和3合并，遍历3n个节点。

123结果和4合并，遍历4n个节点。

...

123...k-1结果和k合并，遍历kn个节点

ListNode *mergeKLists(vector<ListNode *> &lists) {
if(lists.size() == 0)return NULL;
ListNode*res = lists[0];
for(int i = 1; i < lists.size(); i++)
res = merge2list(res, lists[i]);
return res;
}

{
ListNode node(0), *res = &node;
{
{
}
else
{
}
res = res->next;
}
return node.next;
}


0、2合并，合并结果放到0的位置

1、3合并，合并结果放到1的位置

ListNode *mergeKLists(vector<ListNode *> &lists) {
int n = lists.size();
if(n == 0)return NULL;
while(n >1)
{
int k = (n+1)/2;
for(int i = 0; i < n/2; i++)
lists[i] = merge2list(lists[i], lists[i + k]);
n = k;
}
return lists[0];
}

{
ListNode node(0), *res = &node;
{
{
}
else
{
}
res = res->next;
}
return node.next;
}

class Solution {
private:
struct cmp // 比较类
{
bool operator ()(const ListNode *a, const ListNode *b) // 从小到大排列
{
return a->val > b->val;
}
};
public:
ListNode *mergeKLists(vector<ListNode *> &lists) {
int n = lists.size();
if(n == 0)return NULL;
ListNode node(0), *res = &node;// 一个trick，在这里，res充当移动的cursor
priority_queue<ListNode*, vector<ListNode*>, cmp> que;
for(int i = 0; i < n; i++)
if(lists[i])
que.push(lists[i]);
while(!que.empty())
{
ListNode * p = que.top();
que.pop();
res->next = p;
res = p; // 注意，在代码中，没有写res->next = NULL这样的语句，res最后指向的那个节点，其next一定为NULL

if(p->next)// 向que中加入剩下的元素
que.push(p->next);
}
return node.next;
}
};

  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 class Solution { public: struct compNode { bool operator()(ListNode *p, ListNode *q) const { return p->val>q->val; } }; ListNode *mergeKLists(vector &lists) { priority_queue, compNode> pq; ListNode *dummy = new ListNode(0), *tail = dummy; for(int i=0; inext = pq.top(); tail = tail->next; pq.pop(); if(tail->next) pq.push(tail->next); } return dummy->next; } }; 

2n + 3n + ... + kn = [(k+1)*k/2-1]*n = O(nk^2)

  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 class Solution { public: ListNode *mergeKLists(vector &lists) { ListNode *ret = NULL; for(int i=0; ival<=h2->val) { tail->next = h1; h1 = h1->next; } else { tail->next = h2; h2 = h2->next; } tail = tail->next; } tail->next = h1 ? h1 : h2; return dummy->next; } }; 

2n * k/2 + 4n * k/4 + ... + (2^x)n * k/(2^x) = nk * x
k/(2^x) = 1 -> 2^x = k -> x = log2(k)

  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 class Solution { public: ListNode *mergeKLists(vector &lists) { if(lists.empty()) return NULL; int end = lists.size()-1; while(end>0) { int begin = 0; while(beginval<=h2->val) { tail->next = h1; h1 = h1->next; } else { tail->next = h2; h2 = h2->next; } tail = tail->next; } tail->next = h1 ? h1 : h2; return dummy->next; } }; 

0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：190224次
• 积分：5231
• 等级：
• 排名：第5432名
• 原创：312篇
• 转载：238篇
• 译文：2篇
• 评论：12条
评论排行
最新评论