# 23. Merge k Sorted Lists

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; } }; 

• 本文已收录于以下专栏：

## LeetCode 23 Merge k Sorted Lists（合并K个已排序链表）

• NoMasp
• 2015年11月12日 17:30
• 3390

## 【LeetCode】23. Merge k Sorted Lists 基于Java的解法

23. Merge k Sorted Lists Total Accepted: 88102 Total Submissions: 372066 Difficulty: Hard Merge k...
• Jin_Kwok
• 2016年06月04日 00:46
• 1569

## [Leetcode]23. Merge k Sorted Lists @python

• qian2729
• 2016年01月16日 15:32
• 547

## LeetCode(23)Merge K Sorted Lists

• feliciafay
• 2013年12月21日 16:27
• 4168

## LeetCode 23： Merge K Sorted Lists

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. ...
• sunao2002002
• 2015年05月31日 02:04
• 3437

## [LeetCode] 023. Merge k Sorted Lists (Hard) (C++/Java/Python)

[LeetCode] 023. Merge k Sorted Lists (Hard) (C++/Java/Python)
• hcbbt
• 2015年03月05日 11:19
• 2554

## LeetCode-23-Merge-k-Sorted-Lists Python倒循环

• qdbszsj
• 2017年09月11日 13:50
• 255

## LeetCode 23 Merge k Sorted Lists (C,C++,Java,Python)

Problem: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its c...
• runningtortoises
• 2015年05月11日 15:39
• 1013

## Merge k Sorted Lists -- LeetCode

• linhuanmars
• 2014年02月25日 09:45
• 26100

## LeetCode Merge k Sorted Lists 解题报告

• worldwindjp
• 2014年10月11日 15:23
• 8270

举报原因： 您举报文章：23. Merge k Sorted Lists 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)