Merge nums2 into nums1 (in-place)
Given two sorted arrays nums1 (size m + n, with m valid elements followed by n zeros) and nums2 (size n), merge them in-place into nums1 as one sorted array.
def merge(mut nums1: List[Int], nums2: List[Int]):
if len(nums1) == 0 or len(nums2) == 0:
return
# Set pointer m to the last valid element in nums1 (i.e., excluding trailing zeros)
m = len(nums1) - len(nums2) - 1
# Set pointer n to the last element of nums2
n = len(nums2) - 1
# Set pointer last to the end of nums1 (i.e., last index where final element will go)
last = len(nums1) - 1
# Traverse both arrays from the end and fill nums1 from the back
while m >= 0 and n >= 0:
if nums1[m] >= nums2[n]:
# If current nums1 element is greater, place it at 'last' and move pointers
nums1[last] = nums1[m]
m -= 1
else:
# Else, place nums2[n] at 'last' and move pointers
nums1[last] = nums2[n]
n -= 1
last -= 1
# If there are leftover elements in nums2 (i.e., nums2 had smaller elements)
while n >= 0:
nums1[last] = nums2[n]
last -= 1
n -= 1
# No need to handle leftover nums1 elements, they are already in place 1
from std.testing import assert_equal
def main() raises:
nums1 = [5, 8, 11, 13, 0, 0, 0]
nums2 = [3, 9, 19]
merge(nums1, nums2)
assert_equal(nums1, [3, 5, 8, 9, 11, 13, 19], "Assertion failed")
nums1 = [1, 2, 3, 0, 0, 0]
nums2 = [2, 5, 6]
merge(nums1, nums2)
assert_equal(nums1, [1, 2, 2, 3, 5, 6], "Assertion failed")
nums1 = [1]
nums2 = []
merge(nums1, nums2)
assert_equal(nums1, [1], "Assertion failed")