Published: Sep 23, 2022
Introduction
If the problem is about an array and says “don’t return any,” we’d better start from the end of array. Two arrays are sorted, so compare two values from bigger to smaller. The extra space in the first array will be filled out without any conflict.
Problem Description
You are given two integer arrays
nums1andnums2, sorted in non-decreasing order, and two integersmandn, representing the number of elements innums1andnums2respectively. Mergenums1andnums2into 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,nums1has a length ofm + n, where the firstmelements denote the elements that should be merged, and the lastnelements are set to0and should be ignored.nums2has a length ofn.Constraints:
nums1.length == m + nnums2.length == n0 <= m, n <= 2001 <= m + n <= 200-10**9 <= nums1[i], nums2[j] <= 10**9
Examples
Example 1
Input: nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
Output: [1,2,2,3,5,6]
Example 2
Input: nums1 = [1], m = 1, nums2 = [], n = 0
Output: [1]
Example 3
Input: nums1 = [0], m = 0, nums2 = [1], n = 1
Output: [1]
Analysis
Start from the last values of nums1 and nums2. Fill the nums1 from the end so that indices won’t have a conflict. In the end, check all of nums2 is processed. If not, copy the rest of nums2 values to nums1.
Solution
class MergeSortedArray:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
while m > 0 and n > 0:
if nums1[m - 1] >= nums2[n - 1]:
nums1[m + n - 1] = nums1[m - 1]
m -= 1
else:
nums1[m + n - 1] = nums2[n - 1]
n -= 1
if n > 0:
for k in range(n):
nums1[k] = nums2[k]
Complexities
- Time:
O(m + n) - Space:
O(1)