Leetcode-23.合并K个链表

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:

输入:
[
  1->4->5,
  1->3->4,
  2->6
]
输出: 1->1->2->3->4->4->5->6

解法1:挨个插入(笨方法)

将所有节点插入到第一个链表中

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
int i;
int n=lists.size();
if(n==0)
return NULL;
if(n==1)
return lists[0];
ListNode *p=new ListNode(-1);
for(i=1;i<n;i++)
{
p=lists[i];
ListNode *pm=new ListNode(-1);
ListNode *pa=new ListNode(-1);
pm=lists[0];
pa->next=lists[0];
while(p!=NULL&&pm!=NULL)
{
if(p->val<pm->val)
{
ListNode *temp=new ListNode(-1);
if(p->val<lists[0]->val)
{
temp=p;
p=p->next;
temp->next=lists[0];
lists[0]=temp;
pa=lists[0];
}
else
{
temp=p;
p=p->next;
temp->next=pm;
pa->next=temp;
pa=pa->next;
}
}
else
{
pm=pm->next;
pa=pa->next;
}
}
if(pm==NULL&&lists[0]!=NULL)
{
pa->next=p;
}
else if(pm==NULL&&lists[0]==NULL)
lists[0]=p;
}
return lists[0];
}
};

时间复杂度:KN

解法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
27
28
29
class Solution {
public:
struct cmp
{
bool operator()(ListNode* l1, ListNode* l2)
{
return l1->val > l2->val;
}
};
ListNode* mergeKLists(vector<ListNode*>& lists){
ListNode* phead = new ListNode(0);
ListNode* p = phead;
if(lists.size() == 0)
return nullptr;
priority_queue<ListNode*, vector<ListNode*>, cmp> MinHeap;
for(int i = 0;i < lists.size();i++)
if(lists[i] != nullptr)
MinHeap.push(lists[i]);
while(!MinHeap.empty())
{
p->next = MinHeap.top();
p = p->next;
if(MinHeap.top()->next != nullptr)
MinHeap.push(MinHeap.top()->next);
MinHeap.pop();
}
return phead->next;
}
};

时间复杂度:NlogK