https://leetcode.com/problems/merge-sorted-array/?tab=Description
要求不用辅助数组实现merge two sorted array,条件是一个数组的空间足够大。解法是先将nums1的所有元素整体向后平移n个单位,然后算法就和merge two sorted array一样了,只不过nums1的初始指针在位置n处。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
for (int i = m - 1; i >= 0; --i) {
nums1[i+n] = nums1[i];
}
int p = n, q = 0, k = 0;
while (p < m + n && q < n) {
if (nums1[p] < nums2[q])
nums1[k++] = nums1[p++];
else
nums1[k++] = nums2[q++];
}
while (p < m + n) {
nums1[k++] = nums1[p++];
}
while (q < n) {
nums1[k++] = nums2[q++];
}
}
};
更好的做法是直接逆着做merge two sorted array, 一个指针从大数组的m-1位置开始,另一个指针从小数组的n-1位置开始,每次取较大的放在大数组的m+n-1位置, m+n-2位置,...
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int p = m - 1, q = n - 1, k = m + n - 1;
while (p >= 0 && q >= 0) {
if (nums1[p] > nums2[q]) {
nums1[k--] = nums1[p--];
} else {
nums1[k--] = nums2[q--];
}
}
while (p >= 0) {
nums1[k--] = nums1[p--];
}
while (q >= 0) {
nums1[k--] = nums2[q--];
}
}
};