Problem Description
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 nums2 into nums1 as one sorted array. The final sorted array should be stored in 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.
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] Explanation: The arrays we are merging are [1,2,3] and [2,5,6]. The result of the merge is [1,2,2,3,5,6]. Example 2: Input: nums1 = [1], m = 1, nums2 = [], n = 0 Output: [1] Explanation: The arrays we are merging are [1] and []. The result of the merge is [1]. Example 3: Input: nums1 = [0], m = 0, nums2 = [1], n = 1 Output: [1] Explanation: The arrays we are merging are [] and [1]. The result of the merge is [1].
Python Solution
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
# Start from the end of the arrays
last = m + n - 1 # Last position in nums1
m = m - 1 # Last element in nums1
n = n - 1 # Last element in nums2
# While there are elements to compare
while m >= 0 and n >= 0:
if nums1[m] > nums2[n]:
nums1[last] = nums1[m]
m -= 1
else:
nums1[last] = nums2[n]
n -= 1
last -= 1
# If there are remaining elements in nums2
while n >= 0:
nums1[last] = nums2[n]
n -= 1
last -= 1
Java Solution
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
// Start from the end of the arrays
int last = m + n - 1; // Last position in nums1
m = m - 1; // Last element in nums1
n = n - 1; // Last element in nums2
// While there are elements to compare
while (m >= 0 && n >= 0) {
if (nums1[m] > nums2[n]) {
nums1[last] = nums1[m];
m--;
} else {
nums1[last] = nums2[n];
n--;
}
last--;
}
// If there are remaining elements in nums2
while (n >= 0) {
nums1[last] = nums2[n];
n--;
last--;
}
}
}
C++ Solution
class Solution {
public:
void merge(vector& nums1, int m, vector& nums2, int n) {
// Start from the end of the arrays
int last = m + n - 1; // Last position in nums1
m = m - 1; // Last element in nums1
n = n - 1; // Last element in nums2
// While there are elements to compare
while (m >= 0 && n >= 0) {
if (nums1[m] > nums2[n]) {
nums1[last] = nums1[m];
m--;
} else {
nums1[last] = nums2[n];
n--;
}
last--;
}
// If there are remaining elements in nums2
while (n >= 0) {
nums1[last] = nums2[n];
n--;
last--;
}
}
};
JavaScript Solution
/**
* @param {number[]} nums1
* @param {number} m
* @param {number[]} nums2
* @param {number} n
* @return {void} Do not return anything, modify nums1 in-place instead.
*/
var merge = function(nums1, m, nums2, n) {
// Start from the end of the arrays
let last = m + n - 1; // Last position in nums1
m = m - 1; // Last element in nums1
n = n - 1; // Last element in nums2
// While there are elements to compare
while (m >= 0 && n >= 0) {
if (nums1[m] > nums2[n]) {
nums1[last] = nums1[m];
m--;
} else {
nums1[last] = nums2[n];
n--;
}
last--;
}
// If there are remaining elements in nums2
while (n >= 0) {
nums1[last] = nums2[n];
n--;
last--;
}
};
C# Solution
public class Solution {
public void Merge(int[] nums1, int m, int[] nums2, int n) {
// Start from the end of the arrays
int last = m + n - 1; // Last position in nums1
m = m - 1; // Last element in nums1
n = n - 1; // Last element in nums2
// While there are elements to compare
while (m >= 0 && n >= 0) {
if (nums1[m] > nums2[n]) {
nums1[last] = nums1[m];
m--;
} else {
nums1[last] = nums2[n];
n--;
}
last--;
}
// If there are remaining elements in nums2
while (n >= 0) {
nums1[last] = nums2[n];
n--;
last--;
}
}
}
Complexity Analysis
- Time Complexity: O(m + n) where m and n are the lengths of the input arrays
- Space Complexity: O(1) as we modify nums1 in-place
Solution Explanation
This solution uses a three-pointer approach working from the end of the arrays:
last: Points to the last position in nums1 where we'll place the next largest elementm: Points to the current element in nums1n: Points to the current element in nums2
Key points of the solution:
- We start from the end because nums1 has extra space at the end
- We compare elements from both arrays and place the larger one at the end
- This ensures we don't overwrite any elements in nums1 that we still need
- After the main loop, we only need to check for remaining elements in nums2
- Any remaining elements in nums1 are already in their correct position
The approach is optimal because:
- It works in-place without requiring extra space
- Each element is only moved once
- We don't need to shift elements to make space