Skip to content

Commit a7865eb

Browse files
aQuaaQua
aQua
authored and
aQua
committed
finish Problem 23
1 parent 52deeed commit a7865eb

File tree

3 files changed

+57
-51
lines changed

3 files changed

+57
-51
lines changed

Algorithms/0023.merge-k-sorted-lists/README.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
55

66
## 解题思路
7-
7+
最先想到的方案是,依次合并res=merge(res, lists[i]),这个方案的坏处是需要合并两个长度相差很大的链。
8+
LeetCode上最快的解决方法是,借鉴了[归并排序](https://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F)的思想,让lists中临近的list先两两合并,再让新生成的lists中的临近list两两合并,直到合并完成。
89

910
## 总结
10-
11-

Algorithms/0023.merge-k-sorted-lists/merge-k-sorted-lists.go

Lines changed: 42 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -6,65 +6,59 @@ type ListNode struct {
66
Next *ListNode
77
}
88

9-
func mergeKLists(lists []*ListNode) *ListNode {
10-
if len(lists) == 0 {
11-
return nil
12-
}
13-
14-
res := lists[0]
9+
func merge(lists []*ListNode) *ListNode {
10+
length := len(lists)
11+
half := length / 2
1512

16-
for i := 1; i < len(lists); i++ {
17-
res = merge2Lists(res, lists[i])
13+
if length == 1 {
14+
return lists[0]
1815
}
1916

20-
return res
21-
}
17+
if length == 2 {
18+
var (
19+
l0, l1 = lists[0], lists[1]
20+
res, cur *ListNode
21+
)
2222

23-
func merge2Lists(l1 *ListNode, l2 *ListNode) *ListNode {
24-
// 有一条链为nil,直接返回另一条链
25-
if l1 == nil {
26-
return l2
27-
}
28-
if l2 == nil {
29-
return l1
30-
}
31-
32-
// 此时,两条链都不为nil,可以直接使用l.Val,而不用担心panic
33-
// 在l1和l2之间,选择较小的节点作为head,并设置好node
34-
var head, node *ListNode
35-
if l1.Val < l2.Val {
36-
head = l1
37-
node = l1
38-
l1 = l1.Next
39-
} else {
40-
head = l2
41-
node = l2
42-
l2 = l2.Next
43-
}
23+
if l0 == nil {
24+
return l1
25+
}
26+
if l1 == nil {
27+
return l0
28+
}
4429

45-
// 循环比较l1和l2的值,始终选择较小的值连上node
46-
for l1 != nil && l2 != nil {
47-
if l1.Val < l2.Val {
48-
node.Next = l1
49-
l1 = l1.Next
30+
if l0.Val < l1.Val {
31+
res, cur, l0 = l0, l0, l0.Next
5032
} else {
51-
node.Next = l2
52-
l2 = l2.Next
33+
res, cur, l1 = l1, l1, l1.Next
5334
}
5435

55-
// 有了这一步,head才是一个完整的链
56-
node = node.Next
57-
}
36+
for l0 != nil && l1 != nil {
37+
if l0.Val < l1.Val {
38+
cur.Next, l0 = l0, l0.Next
39+
} else {
40+
cur.Next, l1 = l1, l1.Next
41+
}
42+
cur = cur.Next
43+
}
44+
45+
if l0 != nil {
46+
cur.Next = l0
47+
}
48+
if l1 != nil {
49+
cur.Next = l1
50+
}
5851

59-
if l1 != nil {
60-
// 连上l1剩余的链
61-
node.Next = l1
52+
return res
6253
}
6354

64-
if l2 != nil {
65-
// 连上l2剩余的链
66-
node.Next = l2
55+
return mergeKLists([]*ListNode{mergeKLists(lists[half:]), mergeKLists(lists[:half])})
56+
}
57+
58+
func mergeKLists(lists []*ListNode) *ListNode {
59+
if len(lists) == 0 {
60+
return nil
6761
}
6862

69-
return head
63+
return merge(lists)
7064
}

Algorithms/0023.merge-k-sorted-lists/merge-k-sorted-lists_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,19 @@ func Test_Problem0023(t *testing.T) {
4747
ans{[]int{1, 2, 4, 5, 7, 8}},
4848
},
4949

50+
question{
51+
para{[][]int{
52+
[]int{1, 4, 7},
53+
[]int{},
54+
[]int{2, 5, 8},
55+
}},
56+
ans{[]int{1, 2, 4, 5, 7, 8}},
57+
},
58+
59+
question{
60+
para{[][]int{}},
61+
ans{[]int{}},
62+
},
5063
// 如需多个测试,可以复制上方元素。
5164
}
5265

0 commit comments

Comments
 (0)