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:

  1. place-pointer: starting from the end, which value is m + n - 1.

  2. array1-pointer: starting from the last element in array 1.

  3. 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