Merge two sorted arrays in-place
Company: Walmart Labs
Role: Software Engineer
Category: Coding & Algorithms
Difficulty: easy
Interview Round: Onsite
Quick Answer: This question evaluates proficiency in array manipulation, in-place merging concepts, and understanding of time and space complexity when combining sorted sequences. Commonly asked in the coding and algorithms domain (arrays/sorting), it tests practical implementation skills and the ability to produce efficient, low-memory solutions while handling ordering constraints and edge cases.
Constraints
- 0 <= m, n <= 10^5
- len(nums1) == m + n
- len(nums2) == n
- Both input arrays are sorted in non-decreasing order
- -10^9 <= nums1[i], nums2[i] <= 10^9 for valid elements
- Merge must be in-place: no auxiliary array of size m + n
Examples
Input: ([1, 3, 5, 0, 0, 0], 3, [2, 4, 6], 3)
Expected Output: [1, 2, 3, 4, 5, 6]
Explanation: Standard interleave: 1<2<3<4<5<6.
Input: ([0], 0, [1], 1)
Expected Output: [1]
Explanation: nums1 has no valid elements (m=0); result is just nums2.
Input: ([1], 1, [], 0)
Expected Output: [1]
Explanation: nums2 is empty (n=0); nums1 already correct.
Input: ([], 0, [], 0)
Expected Output: []
Explanation: Both arrays empty edge case.
Input: ([4, 5, 6, 0, 0, 0], 3, [1, 2, 3], 3)
Expected Output: [1, 2, 3, 4, 5, 6]
Explanation: All of nums2 is smaller than all of nums1; nums2 slides to the front.
Input: ([1, 2, 3, 0, 0, 0], 3, [2, 5, 6], 3)
Expected Output: [1, 2, 2, 3, 5, 6]
Explanation: Interleaving with a duplicate value (2 appears in both arrays).
Input: ([-1, 0, 0, 0], 1, [-3, -2, 2], 3)
Expected Output: [-3, -2, -1, 2]
Explanation: Negative numbers, m=1, n=3.
Input: ([2, 2, 2, 0, 0], 3, [2, 2], 2)
Expected Output: [2, 2, 2, 2, 2]
Explanation: All elements equal; stability of writes does not affect the sorted result.
Hints
- If you merge from the front (smallest first), you risk overwriting elements of nums1 you haven't read yet. Try filling positions from the back instead.
- Use three pointers: i at the last valid nums1 element (m-1), j at the last nums2 element (n-1), and k at the very last slot of nums1 (m+n-1).
- At each step write the larger of nums1[i] and nums2[j] into nums1[k], then move that pointer and k left. When nums2 is exhausted (j < 0) you're done — any remaining nums1 elements are already in place.
- Guard against i < 0 (nums1 had no valid elements left) so you fall back to copying the rest of nums2.