两种解法 双指针
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
vector<int> result(m + n);
int index = 0;
int i = 0;
int j = 0;
while(i < m && j < n) {
if(nums1[i] <= nums2[j]) {
result[index] = nums1[i];
i++;
index++;
}
else {
result[index] = nums2[j];
index++;
j++;
}
}
if(i == m) {
while(index < m + n) {
result[index++] = nums2[j++];
}
}
else {
while(index < m + n) {
result[index++] = nums1[i++];
}
}
int k = 0;
for(int num : result) {
nums1[k++] = num;
}
}
};
比较两组数组,将较大值放在数组1的末尾,swap
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
// 均为下标
int index = m + n - 1;
int i = m - 1;
int j = n - 1;
while(i >= 0 && j >= 0) {
// 这个=在哪 对结果无影响
if(nums1[i] >= nums2[j]) {
swap(nums1[i], nums1[index]);
i--;
}
else {
swap(nums2[j], nums1[index]);
j--;
}
index--;
}
// nums1为{3, 4, 5, 0, 0}
// nums2为{1, 2}的情况
// 这一步骤前{0, 0, 3, 4, 5}
// index下标为1, i = -1, j = 1
// 将nums2剩余部分附加在nums1上
if(i == -1) {
while(index >= 0) {
nums1[index] = nums2[j];
index--;
j--;
}
}
}
};