法一:使用额外数组存储再返回去赋值。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int nums1_point = 0, nums2_point = 0, nums3_point = 0;
vector<int> nums3(m + n, 0);
if (m == 0) {
nums1.assign(nums2.begin(), nums2.end());
}
else if (m != 0 && n != 0) {
while (nums1_point < m && nums2_point < n) { //这里的m不能用num1.size()替代,会数组越界
if (nums1[nums1_point] <= nums2[nums2_point]) {
nums3[nums3_point++] = nums1[nums1_point++];
}
else {
nums3[nums3_point++] = nums2[nums2_point++];
}
}
while (nums1_point < m) {
nums3[nums3_point++] = nums1[nums1_point++];
}
while (nums2_point < n) {
nums3[nums3_point++] = nums2[nums2_point++];
}
nums1.assign(nums3.begin(), nums3.end());
}
}
};
法二:利用两个数组都有序,且数组一有m+n个位置。所以从两个数组的末尾开始比较,m,n正好作为两个尾指针,再增加一个最终指针pos = m + n - 1。num1和num2每次比较最后一个元素,更大的那个则被保存到pos位置,同时pos--,且m或n--。
为什么不会出现pos占据num1中m中未比较的点情况?
考虑最坏情况,即m一直未动,而一直n--,则pos也最多减去n,因为num1有m+n个位置,所以最坏也追不上。