https://leetcode.com/problems/merge-sorted-array/submissions/1497639536/?envType=study-plan-v2&envId=top-interview-150
Python
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
m_idx = m - 1
n_idx = n - 1
right = m + n - 1
while n_idx >= 0:
if m_idx >= 0 and nums1[m_idx] > nums2[n_idx]:
nums1[right] = nums1[m_idx]
m_idx -= 1
else:
nums1[right] = nums2[n_idx]
n_idx -= 1
right -= 1
C++
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int m_idx = m - 1;
int n_idx = n - 1;
int right = m + n - 1;
while (n_idx >= 0){
if (m_idx >= 0 && nums1[m_idx] > nums2[n_idx]){
nums1[right] = nums1[m_idx];
m_idx -= 1;
}
else{
nums1[right] = nums2[n_idx];
n_idx -= 1;
}
right -= 1;
}
}
};
$$ \text{Time} = O(N+M)\\ \text{Space} = O(1) $$
Pseudocode:
m-1), end of nums2 (n-1), and end of nums1's total space (m+n-1)nums2 still has unplaced elements:
nums1's pointer is valid and nums1's current element > nums2's current element:
nums1's current element at the right pointernums1's pointer leftnums2's current element at the right pointernums2's pointer left