分析
-
本题的考点:双指针。
-
这其实是归并排序中的一步,唯一需要注意的一点就是我们从后向前遍历并将结果存入
nums1
中即可。
代码
- C++
class Solution {
public:
void merge(vector<int> &nums1, int m, vector<int> &nums2, int n) {
m--, n--;
for (int i = nums1.size() - 1; i >= 0; i--) {
if (n < 0) nums1[i] = nums1[m--];
else if (m < 0) nums1[i] = nums2[n--];
else if (nums1[m] >= nums2[n]) nums1[i] = nums1[m--];
else nums1[i] = nums2[n--];
}
}
};
- Java
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
for (int k = m + n - 1, i = m - 1, j = n - 1; k >= 0; k--) {
if (i < 0) nums1[k] = nums2[j--];
else if (j < 0) nums1[k] = nums1[i--];
else if (nums1[i] >= nums2[j]) nums1[k] = nums1[i--];
else nums1[k] = nums2[j--];
}
}
}
时空复杂度分析
-
时间复杂度:$O(n + m)$。
-
空间复杂度:$O(1)$。