0088. Merge Sorted Array
Easy | Array + Two Pointers | 16ms (98.22%), 13.3 MB (94.73%)
Source: LeetCode - Merge Sorted Array GitHub: Solution / Performance
You are given two integer arrays nums1
and nums2
, sorted in non-decreasing order, and two integers m
and n
, representing the number of elements in nums1
and nums2
respectively.
Merge nums1
and nums2
into a single array sorted in non-decreasing order.
The final sorted array should not be returned by the function, but instead be stored inside the array nums1
. To accommodate this, nums1
has a length of m + n
, where the first m
elements denote the elements that should be merged and the last n
elements are set to 0
and should be ignored. nums2
has a length of n
.
Three-pointer is required for placing numbers reversely from the end of array1:
place-pointer: starting from the end, which value is
m + n - 1
.array1-pointer: starting from the last element in array 1.
array2-pointer: starting from the last element in array 2.
Note that since the above pointers move forward (index is decreasing in each iteration), if array2-pointer reaches the beginning p2 < 0
, we could return directly because array1 is already sorted correctly. On the other hand, we also need to check whether array1-pointer reaches the beginning by p1 >= 0
.
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
# (base case)
if n == 0: return
if m == 0:
for i in range(n): nums1[i] = nums2[i]
# ==================================================
# Array + Three Pointers (Start from End) =
# ==================================================
# time : O(m+n)
# space : O(1)
p1, p2, placeP = m - 1, n - 1, m + n - 1
while placeP >= 0:
if p2 < 0: return
if p1 >= 0 and nums1[p1] >= nums2[p2]:
nums1[placeP] = nums1[p1]
p1 -= 1
else:
nums1[placeP] = nums2[p2]
p2 -= 1
placeP -= 1
Last updated
Was this helpful?