从第四题过来的,这题主要是个两路合并排序,这里主要有个限制是个要在nums1数组直接改,而不是建个新数组,不然可以少考虑很多东西
我这里用的是双指针法,参考题解用了一个逆向指针很有意思,从后往前放最大的,这样可以直接把0扔掉。
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
//这里我用的双指针法
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int index1 = 0;
int index2 = 0;
for (int i = m; i < m + n; i++)
{
nums1[i] = pow(10,9);//反正这些0都是要扔掉的,不如换成大数方便比较大小
}
while (index2 < n)
{
if (nums1[index1] <= nums2[index2])
{
index1++;
}//如果nums1数组里较小,往下延伸就行
else
{
nums1.insert(nums1.begin() + index1, nums2[index2]);
index2++;
index1++;
nums1.pop_back();//去掉后面的多余的0
}
}
}
};
//题解里一个很有意思的方法,逆向指针,从后面开始找大的,这样直接在nums1上修改
class Solution1{
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int p1 = m - 1, p2 = n - 1;
int tail = m + n - 1;
int cur;
while (p1 >= 0 || p2 >= 0) {
if (p1 == -1) {
cur = nums2[p2--];
}
else if (p2 == -1) {
cur = nums1[p1--];
}
else if (nums1[p1] > nums2[p2]) {
cur = nums1[p1--];
}
else {
cur = nums2[p2--];
}
nums1[tail--] = cur;
}
}
};
int main()
{
vector<int>nums1 = {1};
vector<int>nums2 = { };
Solution test;
test.merge(nums1, 1, nums2, 0);
for (int i = 0; i < nums1.size(); i++)
{
cout << nums1[i];
}
}