原题目
1、解题思路
2、小贴士
1、首先初始化了指向两个数组末尾的指针 p1 和 p2,以及指向合并后数组末尾的指针 p。然后从后向前比较两个数组的元素,并将较大的元素放入合并后的数组的末尾。最后,如果 nums2 中还有剩余的元素,将其复制到 nums1 的前面。
2、void merge(vector& nums1, int m, vector& nums2, int n)定义函数时采用地址传递。merge 函数的参数使用地址传递,因此函数内部对 nums1 和 nums2 的修改会直接影响到 main 函数中的实际向量。merge 函数的参数使用地址传递,因此函数内部对 nums1 和 nums2 的修改会直接影响到 main 函数中的实际向量。
3、代码实现
#include<iostream>
#include<vector>
using namespace std;
class solution
{
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n)
{
//初始化指针
int p1 = m - 1;
int p2 = n - 1;
int p = m + n - 1;
//合并数组
while (p1 >= 0 && p2 >= 0) {
if (nums1[p1] > nums2[p2]) {
nums1[p] = nums1[p1];
p1--;
}
else {
nums1[p] = nums2[p2];
p2--;
}
p--;
}
while (p2 >= 0)
{
nums1[p] = nums2[p2];
p--;
p2--;
}
}
};
int main()
{
vector<int> nums1 = {1,2,3,0,0,0};
int m = 3;
vector<int> nums2 = {2,5,6};
int n = 3;
solution s;
s.merge(nums1, m, nums2, n);
int l = m + n;
for (int i = 0; i < l; i++)
{
cout << nums1[i] << "";
}
cout << endl;
return 0;
}