Skip to content

Commit 7ebda7b

Browse files
committed
2026-03-07 00:47
1 parent a1492e1 commit 7ebda7b

4 files changed

Lines changed: 141 additions & 0 deletions

File tree

src/notes/writeups/leetcode/index.rst

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -868,3 +868,15 @@ Ones and Zeroes
868868

869869
.. [#] https://twitter.com/mxcl/status/608682016205344768
870870
.. [#] https://oi-wiki.org/ds/monotonous-stack/
871+
872+
Merge Sorted Array
873+
------------------
874+
875+
.. leetcode:: _
876+
:id: merge-sorted-array
877+
:diffculty: Easy
878+
:language: go
879+
:key: 排序
880+
:date: 2026-03-05
881+
882+
很简单的一道题,要不先把 nums1 挪开然后直接合并,要不逆序。之前想复杂了。
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module merge-sorted-array
2+
3+
go 1.25.0
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package main
2+
3+
func merge(nums1 []int, m int, nums2 []int, n int) {
4+
p1, p2 := m-1, n-1
5+
p := m+n-1
6+
res := nums1
7+
8+
for p1 >= 0 && p2 >= 0 {
9+
if nums1[p1] > nums2[p2] {
10+
res[p] = nums1[p1]
11+
p1--
12+
} else {
13+
res[p] = nums2[p2]
14+
p2--
15+
}
16+
p--
17+
}
18+
19+
if p1 < 0 && p2 >= 0 {
20+
copy(res[0:p+1], nums2[:p2+1])
21+
}
22+
if p2 < 0 && p1 <= 0 {
23+
copy(res[0:p+1], nums1[:p1+1])
24+
}
25+
}
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package main
2+
3+
import (
4+
"reflect"
5+
"testing"
6+
)
7+
8+
func TestMerge(t *testing.T) {
9+
tests := []struct {
10+
name string
11+
nums1 []int
12+
m int
13+
nums2 []int
14+
n int
15+
expected []int
16+
}{
17+
{
18+
name: "basic merge",
19+
nums1: []int{1, 2, 3, 0, 0, 0},
20+
m: 3,
21+
nums2: []int{4, 5, 6},
22+
n: 3,
23+
expected: []int{1, 2, 3, 4, 5, 6},
24+
},
25+
{
26+
name: "basic merge1",
27+
nums1: []int{4, 5, 6, 0, 0, 0},
28+
m: 3,
29+
nums2: []int{1, 2, 3},
30+
n: 3,
31+
expected: []int{1, 2, 3, 4, 5, 6},
32+
},
33+
{
34+
name: "basic merge2",
35+
nums1: []int{1, 2, 3, 0, 0, 0},
36+
m: 3,
37+
nums2: []int{2, 5, 6},
38+
n: 3,
39+
expected: []int{1, 2, 2, 3, 5, 6},
40+
},
41+
{
42+
name: "basic merge3",
43+
nums1: []int{4, 5, 6, 0, 0, 0},
44+
m: 3,
45+
nums2: []int{1, 2, 10},
46+
n: 3,
47+
expected: []int{1, 2, 4, 5, 6, 10},
48+
},
49+
{
50+
name: "nums1 is empty",
51+
nums1: []int{0, 0, 0},
52+
m: 0,
53+
nums2: []int{1, 2, 3},
54+
n: 3,
55+
expected: []int{1, 2, 3},
56+
},
57+
{
58+
name: "nums2 is empty",
59+
nums1: []int{1, 2, 3},
60+
m: 3,
61+
nums2: []int{},
62+
n: 0,
63+
expected: []int{1, 2, 3},
64+
},
65+
{
66+
name: "all nums2 elements smaller",
67+
nums1: []int{4, 5, 6, 0, 0, 0},
68+
m: 3,
69+
nums2: []int{1, 2, 3},
70+
n: 3,
71+
expected: []int{1, 2, 3, 4, 5, 6},
72+
},
73+
{
74+
name: "all nums1 elements smaller",
75+
nums1: []int{1, 2, 3, 0, 0, 0},
76+
m: 3,
77+
nums2: []int{4, 5, 6},
78+
n: 3,
79+
expected: []int{1, 2, 3, 4, 5, 6},
80+
},
81+
{
82+
name: "single element merge",
83+
nums1: []int{1, 0},
84+
m: 1,
85+
nums2: []int{0},
86+
n: 1,
87+
expected: []int{0, 1},
88+
},
89+
}
90+
91+
for _, tt := range tests {
92+
t.Run(tt.name, func(t *testing.T) {
93+
nums1Copy := make([]int, len(tt.nums1))
94+
copy(nums1Copy, tt.nums1)
95+
merge(nums1Copy, tt.m, tt.nums2, tt.n)
96+
if !reflect.DeepEqual(nums1Copy, tt.expected) {
97+
t.Errorf("merge() = %v, want %v", nums1Copy, tt.expected)
98+
}
99+
})
100+
}
101+
}

0 commit comments

Comments
 (0)