Skip to content

Commit 0483dcd

Browse files
Add 'Merge Sorted Array'
1 parent 11cd559 commit 0483dcd

File tree

3 files changed

+80
-0
lines changed

3 files changed

+80
-0
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ A collection of LeetCode solutions
5858

5959
[Merge k Sorted Lists](./src/merge_k_sorted_lists.py)
6060

61+
[Merge Sorted Array](./src/merge_sorted_array.py)
62+
6163
[Merge Strings Alternately](./src/merge_strings_alternately.py)
6264

6365
[Merge Two Sorted Lists](./src/merge_two_sorted_lists.py)

src/merge_sorted_array.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
"""
2+
88. Merge Sorted Array
3+
4+
https://leetcode.com/problems/merge-sorted-array
5+
6+
NOTES
7+
* Use three pointer merge algorithm.
8+
9+
The fact that the first array, `nums1`, has additional space (n) should signify
10+
that the problem can be solved without additional space. Since both arrays are
11+
already sorted, only an O(m + n) traversal is required to merge them. By
12+
starting the traversal from m - 1 and n - 1 of `nums1` and `nums2`,
13+
respectively, and by leveraging the additional space appended to `nums1`, the
14+
arrays can be merged in-place without the need for additional space.
15+
"""
16+
17+
18+
class Solution:
19+
def merge(self, nums1: list[int], m: int, nums2: list[int], n: int) -> None:
20+
"""
21+
Do not return anything, modify nums1 in-place instead.
22+
"""
23+
p1, p2, p3 = m - 1, n - 1, m + n - 1
24+
25+
while p1 >= 0 and p2 >= 0:
26+
if nums1[p1] >= nums2[p2]:
27+
nums1[p3] = nums1[p1]
28+
p1 -= 1
29+
p3 -= 1
30+
else:
31+
nums1[p3] = nums2[p2]
32+
p2 -= 1
33+
p3 -= 1
34+
35+
while p1 >= 0:
36+
nums1[p3] = nums1[p1]
37+
p1 -= 1
38+
p3 -= 1
39+
40+
while p2 >= 0:
41+
nums1[p3] = nums2[p2]
42+
p2 -= 1
43+
p3 -= 1

tests/test_merge_sorted_array.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
"""
2+
88. Merge Sorted Array
3+
4+
https://leetcode.com/problems/merge-sorted-array
5+
"""
6+
7+
from unittest import TestCase
8+
9+
from src.merge_sorted_array import Solution
10+
11+
12+
class TestSolution(TestCase):
13+
def test_1(self):
14+
exp = [1, 2, 2, 3, 5, 6]
15+
nums1, nums2 = [1, 2, 3, 0, 0, 0], [2, 5, 6]
16+
Solution().merge(nums1, 3, nums2, 3)
17+
assert nums1 == exp
18+
19+
def test_2(self):
20+
exp = [1]
21+
nums1, nums2 = [1], []
22+
Solution().merge(nums1, 1, nums2, 0)
23+
assert nums1 == exp
24+
25+
def test_3(self):
26+
exp = [1]
27+
nums1, nums2 = [0], [1]
28+
Solution().merge(nums1, 0, nums2, 1)
29+
assert nums1 == exp
30+
31+
def test_4(self):
32+
exp = [1, 2, 3, 4, 5, 6]
33+
nums1, nums2 = [4, 5, 6, 0, 0, 0], [1, 2, 3]
34+
Solution().merge(nums1, 3, nums2, 3)
35+
assert nums1 == exp

0 commit comments

Comments
 (0)