Description: Merge nums1 and nums2 into a single array sorted in non-decreasing order.

Code:

def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
    # initialize the three pointers (note arrays are already sorted)
    i = m - 1 #arr1 
    j = n - 1 #arr2
    k = m + n - 1 #arr1 + arr2

    while i >= 0 and j >= 0:
        if nums1[i] >= nums2[j]:
            nums1[k] = nums1[i]
            i -= 1
        else:
            nums1[k] = nums2[j]
            j -= 1
        k -=1

    while j>= 0:
        nums1[k] = nums2[j]    
        j -=1
        k -=1

Efficiency:

Time Complexity: O(n+m)

Space Complexity: O(1)

Test:

nums1 = [1,2,3,0,0,0]
m = 3
nums2 = [2,5,6]
n = 3
merge(nums1, m, nums2, n) 
print(nums1) #Output: [1,2,2,3,5,6]

nums1, m, nums2, n = [1], 1, [], 0
merge(nums1, m, nums2, n) 
print(nums1) #Output: [1]

nums1 = [0]
m = 0
nums2 = [1]
n = 1
merge(nums1, m, nums2, n) 
print(nums1) #Output: [1]