8000 added 115 · skycache/LeetCode-1@5075945 · GitHub
[go: up one dir, main page]

Skip to content

Commit 5075945

Browse files
committed
added 115
1 parent 43039e4 commit 5075945

File tree

3 files changed

+107
-0
lines changed

3 files changed

+107
-0
lines changed

115. Merge k Sorted Lists/README.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
这一阶段的 LeetCode 有一个明显的特点,就是在增加难度的同时,还紧密联系之前的 Easy 难度的题目。
2+
3+
昨天的两道姊妹题是如此,今天的链表题依旧如此。
4+
5+
这道题,显然是 [019. Merge Two Sorted Lists](../019. Merge Two Sorted Lists) 的升级版。
6+
7+
对于想复习基础的链表操作的童鞋,我推荐看看我的[这篇总结](http://segmentfault.com/blog/pezy/1190000002490878)
8+
9+
-----
10+
11+
拿到问题,合并多个链表。而此刻,我们已经掌握了合并两个链表的方法。于是我们很自然的列出以下几种情况:
12+
13+
- lists.empty() : 返回 NULL
14+
- lists.size() == 1 : 返回该链表
15+
- lists.size() == 2 : 正好碰枪口,mergeTwoLists.
16+
- lists.size() == 3 : 先合并后两个,在将其结果与第三个合并。
17+
- lists.size() == 4 : 先两两合并,然后再将结果合并。
18+
- ...
19+
20+
就没必要一直列下去了吧。
21+
22+
分而治之,是非常自然而然的思路,我们如果会造枪,但要的却是炮,我们将枪捆在一起,捆的无限多,便成了炮。
23+
24+
注意,为了更方便分治,我们将原题目的接口扩展为更通用的迭代器接口。
25+
26+
然后核心的语句是:
27+
28+
return mergeTwoLists(mergeKLists(beg, beg + std::distance(beg, end)/2), mergeKLists(beg + std::distance(beg, end)/2, end));
29+
30+
提交,AC,离最快差了不过 4 ms.

115. Merge k Sorted Lists/main.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#include "solution.h"
2+
#include <iostream>
3+
4+
using namespace std;
5+
6+
ListNode *create_linkedlist(std::initializer_list<int> lst)
7+
{
8+
auto iter = lst.begin();
9+
ListNode *head = lst.size() ? new ListNode(*iter++) : nullptr;
10+
for (ListNode *cur=head; iter != lst.end(); cur=cur->next)
11+
cur->next = new ListNode(*iter++);
12+
return head;
13+
}
14+
15+
void clear(ListNode *head)
16+
{
17+
while (head) {
18+
ListNode *del = head;
19+
head = head->next;
20+
delete del;
21+
}
22+
}
23+
24+
void printList(ListNode *head) {
25+
for (ListNode *cur = head; cur; cur = cur->next)
26+
cout << cur->val << "->";
27+
cout << "\b\b " << endl;
28+
}
29+
30+
int main()
31+
{
32+
Solution s;
33+
vector<ListNode *> vec{
34+
create_linkedlist({1,3,5,7,9}),
35+
create_linkedlist({2,4,6,8,10}),
36+
create_linkedlist({0,11,12,13,14})
37+
};
38+
ListNode *ret = s.mergeKLists(vec);
39+
printList(ret);
40+
clear(ret);
41+
42+
return 0;
43+
}
44+

115. Merge k Sorted Lists/solution.h

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#include <vector>
2+
using std::vector;
3+
#include <cstddef>
4+
5+
struct ListNode {
6+
int val;
7+
ListNode *next;
8+
ListNode(int x) : val(x), next(NULL) {}
9+
};
10+
11+
class Solution {
12+
ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) {
13+
ListNode *head = NULL, **lastPtrRef = &head;
14+
for (;l1 && l2; lastPtrRef = &((*lastPtrRef)->next)) {
15+
if (l1->val <= l2->val) { *lastPtrRef = l1; l1 = l1->next; }
16+
else { *lastPtrRef = l2; l2 = l2->next; }
17+
}
18+
*lastPtrRef = l1 ? l1 : l2;
19+
return head;
20+
}
21+
22+
using vecNodeCIter = vector<ListNode *>::const_iterator;
23+
ListNode *mergeKLists(vecNodeCIter beg, vecNodeCIter end) {
24+
if (beg == end) return NULL;
25+
else if (std::distance(beg, end) == 1) return *beg;
26+
else if (std::distance(beg, end) == 2) return mergeTwoLists(*beg, *std::next(beg));
27+
else return mergeTwoLists(mergeKLists(beg, beg + std::distance(beg, end)/2), mergeKLists(beg + std::distance(beg, end)/2, end));
28+
}
29+
public:
30+
ListNode *mergeKLists(vector<ListNode *> &lists) {
31+
return mergeKLists(lists.cbegin(), lists.cend());
32+
}
33+
};

0 commit comments

Comments
 (0)
0