Skip to content

Commit 25f519b

Browse files
authored
Merge pull request doocs#53 from KongJHong/master
Add solution 023[CPP]
2 parents 18c5e1c + d021c98 commit 25f519b

File tree

2 files changed

+164
-1
lines changed

2 files changed

+164
-1
lines changed

solution/023.Merge k Sorted Lists/README.md

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,18 @@
1717
### 解法
1818
从链表数组索引 0 开始,[合并前后相邻两个有序链表](https://github.com/yanglbme/leetcode/tree/master/solution/021.Merge%20Two%20Sorted%20Lists),放在后一个链表位置上,依次循环下去...最后 lists[len - 1] 即为合并后的链表。注意处理链表数组元素小于 2 的情况。
1919

20+
--------------------------------
21+
思路1: 170ms
22+
用第一个链依次和后面的所有链进行双链合并,利用021的双顺序链合并,秒杀!但是效率极低
23+
时间复杂度是O(x(a+b) + (x-1)(a+b+c) + ... + 1 * (a+b+...+z);
24+
时间复杂度是极大的
25+
26+
27+
思路2: 20ms
28+
1.因为链表有序,所以用每个链表的首元素构建初试堆(小顶堆) -- 的队列
29+
2.首元素出队,该元素出队
30+
时间复杂度是O(n)
31+
2032
```java
2133
/**
2234
* Definition for singly-linked list.
@@ -66,4 +78,50 @@ class Solution {
6678
return l2;
6779
}
6880
}
69-
```
81+
```
82+
83+
#### CPP
84+
85+
```C++
86+
class compare
87+
{
88+
public:
89+
bool operator()(ListNode *l1,ListNode *l2){
90+
//if(!l1 || !l2)
91+
// return !l1;
92+
93+
if(l1 == NULL)return 1;
94+
if(l2 == NULL)return 0;
95+
return l1->val > l2->val;
96+
//这里比较的是优先级,默认优先级排序是“<”号,若 l1Val > l2Val 返回真,即表示l1优先级比l2小,l2先入队
97+
//队列的top()函数指的就是优先级最高的元素,即队头元素
98+
}
99+
};
100+
101+
class Solution{
102+
public:
103+
ListNode* mergeKLists(vector<ListNode*>& lists) {
104+
int len = lists.size();
105+
if(len == 0)return NULL;
106+
107+
priority_queue<ListNode*,vector<ListNode*>,compare> Q;//调用小顶堆的方法构造队列!!!
108+
109+
for(int i = 0;i < len;i++)
110+
{
111+
if(lists[i])Q.push(lists[i]);
112+
}
113+
114+
ListNode *head = new ListNode(0);
115+
ListNode *tail = head;
116+
while(!Q.empty() && Q.top() != NULL)
117+
{
118+
ListNode *tmp = Q.top();
119+
Q.pop();
120+
tail->next = tmp;
121+
tail = tail->next;
122+
Q.push(tmp->next);
123+
}
124+
return head->next;
125+
}
126+
};
127+
```
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
class compare
2+
{
3+
public:
4+
bool operator()(ListNode *l1,ListNode *l2){
5+
//if(!l1 || !l2)
6+
// return !l1;
7+
8+
if(l1 == NULL)return 1;
9+
if(l2 == NULL)return 0;
10+
return l1->val > l2->val;
11+
//这里比较的是优先级,默认优先级排序是“<”号,若 l1Val > l2Val 返回真,即表示l1优先级比l2小,l2先入队
12+
//队列的top()函数指的就是优先级最高的元素,即队头元素
13+
}
14+
};
15+
16+
17+
class Solution{
18+
public:
19+
ListNode* mergeKLists(vector<ListNode*>& lists) {
20+
int len = lists.size();
21+
if(len == 0)return NULL;
22+
23+
priority_queue<ListNode*,vector<ListNode*>,compare> Q;//调用小顶堆的方法构造队列!!!
24+
25+
for(int i = 0;i < len;i++)
26+
{
27+
if(lists[i])Q.push(lists[i]);
28+
}
29+
30+
ListNode *head = new ListNode(0);
31+
ListNode *tail = head;
32+
while(!Q.empty() && Q.top() != NULL)
33+
{
34+
ListNode *tmp = Q.top();
35+
Q.pop();
36+
tail->next = tmp;
37+
tail = tail->next;
38+
Q.push(tmp->next);
39+
}
40+
return head->next;
41+
}
42+
};
43+
44+
-----------------------------------------------------------------------
45+
/**
46+
* Definition for singly-linked list.
47+
* struct ListNode {
48+
* int val;
49+
* ListNode *next;
50+
* ListNode(int x) : val(x), next(NULL) {}
51+
* };
52+
*/
53+
class Solution {
54+
public:
55+
ListNode* merge(ListNode*l1,ListNode*l2){ //将两个链表合并的函数
56+
if(l1==NULL&&l2!=NULL) //如果两个链表有一个为空,那么返回另外一个。如果都为空,返回NULL。
57+
return l2;
58+
else if(l1!=NULL&&l2==NULL)
59+
return l1;
60+
else if(l1==NULL&&l2==NULL)
61+
return NULL;
62+
63+
ListNode*ans,*p;
64+
if(l1->val<=l2->val){ //处理首节点
65+
ans=l1;
66+
l1=l1->next;
67+
}
68+
else{
69+
ans=l2;
70+
l2=l2->next;
71+
}
72+
p=ans;
73+
while(l1!=NULL&&l2!=NULL){ //每次从两个链表中取出一个结点放到结果链表当中
74+
if(l1->val<=l2->val)
75+
{
76+
p->next=l1;
77+
l1=l1->next;
78+
}
79+
else
80+
{
81+
p->next=l2;
82+
l2=l2->next;
83+
}
84+
p = p->next;
85+
}
86+
87+
88+
if(l1!=NULL)p->next=l1;
89+
if(l2!=NULL)p->next=l2;
90+
91+
return ans;
92+
}
93+
94+
ListNode* mergeKLists(vector<ListNode*>& lists) {
95+
int len = lists.size();
96+
if(len == 0)return NULL;
97+
98+
ListNode *ans = lists[0];
99+
for(int i = 1; i < len;i++){
100+
ans = merge(ans,lists[i]);
101+
}
102+
103+
return ans;
104+
}
105+
};

0 commit comments

Comments
 (0)