LeetCode 88
https://leetcode.cn/problems/merge-sorted-array/description/
难度:简单
本题最简单的思路是使用额外的空间存储,最后复制回 nums1。那么有没有什么方案可以避免额外空间?答案是使用逆向双指针算法。从最后一个元素开始,将结果赋值到 nums1。这样可以避免 nums1 中元素被覆盖的问题。
时间复杂度:O(m+n)。
空间复杂度:O(1)。仅用到若干额外变量。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int p1 = m - 1, p2 = n - 1, p = m + n - 1;
while (p2 >= 0) { // nums2 还有要合并的元素
// 如果 p1 < 0,那么走 else 分支,把 nums2 合并到 nums1 中
if (p1 >= 0 && nums1[p1] > nums2[p2]) {
nums1[p--] = nums1[p1--]; // 填入 nums1[p1]
} else {
nums1[p--] = nums2[p2--]; // 填入 nums2[p1]
}
}
}
};