0088. Merge Sorted Array¶
Problem¶
| Leetcode | 88. Merge Sorted Array |
| Difficulty | |
| Tags | Array, Two Pointers, Sorting |
You are given two integer arrays
nums1andnums2, sorted in non-decreasing order, and two integersmandn, representing the number of elements innums1andnums2respectively.Merge
nums1andnums2into 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.
Examples¶
Input: nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
Output: [1,2,2,3,5,6]
Input: nums1 = [1], m = 1, nums2 = [], n = 0
Output: [1]
Input: nums1 = [0], m = 0, nums2 = [1], n = 1
Output: [1]
Constraints¶
nums1.length == m + nnums2.length == n0 <= m, n <= 2001 <= m + n <= 200-10^9 <= nums1[i], nums2[j] <= 10^9
Approach: Two Pointers from the End¶
Idea¶
Walk from the back: place the larger of nums1[i] and nums2[j] at nums1[k] where k = m + n - 1. Decrement accordingly. After exhausting nums2 we are done; remaining nums1 already in place.
Algorithm¶
i = m - 1, j = n - 1, k = m + n - 1.- While
j >= 0: - If
i >= 0 && nums1[i] > nums2[j]:nums1[k] = nums1[i]; i--. - Else:
nums1[k] = nums2[j]; j--. k--.
Complexity¶
- Time: O(m + n)
- Space: O(1)
Implementation¶
Go¶
func merge(nums1 []int, m int, nums2 []int, n int) {
i, j, k := m-1, n-1, m+n-1
for j >= 0 {
if i >= 0 && nums1[i] > nums2[j] {
nums1[k] = nums1[i]
i--
} else {
nums1[k] = nums2[j]
j--
}
k--
}
}
Java¶
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int i = m - 1, j = n - 1, k = m + n - 1;
while (j >= 0) {
if (i >= 0 && nums1[i] > nums2[j]) {
nums1[k--] = nums1[i--];
} else {
nums1[k--] = nums2[j--];
}
}
}
}
Python¶
class Solution:
def merge(self, nums1, m, nums2, n):
i, j, k = m - 1, n - 1, m + n - 1
while j >= 0:
if i >= 0 and nums1[i] > nums2[j]:
nums1[k] = nums1[i]; i -= 1
else:
nums1[k] = nums2[j]; j -= 1
k -= 1
Edge Cases¶
m = 0: nums1 is all zeros → just copy nums2.n = 0: do nothing.- All nums2 < all nums1: shifts everything right.
- All nums2 > all nums1: append.