Solution 1
一个没有使用链表的归并排序,有一点点不同的是,由于使用的是vector并要求原位归并,所以从后往前可以保证不会出大问题。
- 时间复杂度: O ( m + n ) O(m+n) O(m+n),其中 m m m和 n n n为两个数组的非空长度(也就是给定的nums1的长度)
- 空间复杂度: O ( 1 ) O(1) O(1),原位归并,仅维护常数个状态量
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int pos1 = m - 1, pos2 = n - 1, pos = m + n - 1;
while (pos1 >= 0 && pos2 >= 0) {
nums1[pos--] = nums1[pos1] > nums2[pos2] ? nums1[pos1--]: nums2[pos2--];
}
// 可能有剩下的
while (pos1 >= 0) {
nums1[pos--] = nums1[pos1--];
}
while (pos2 >= 0) {
nums1[pos--] = nums2[pos2--];
}
}
};
Solution 2
Solution 1的Python实现
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.
"""
pos1, pos2 = m - 1, n - 1
pos = m + n - 1
while pos1 >= 0 and pos2 >= 0:
if nums1[pos1] > nums2[pos2]:
nums1[pos] = nums1[pos1]
pos1 -= 1
else:
nums1[pos] = nums2[pos2]
pos2 -= 1
pos -= 1
while pos1 >= 0:
nums1[pos] = nums1[pos1]
pos -= 1
pos1 -= 1
while pos2 >= 0:
nums1[pos] = nums2[pos2]
pos -= 1
pos2 -= 1