自己没做出来
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n)
{
int left = 0;
int right = m;
int temp = 0;
if(m+n==1)
{
if(n == 1)
{
printv(nums1,1);
}
if(m == 1)
{
printv(nums2,1);
}
}
else
{
for(int i = m;i<m+n;i++)
{
nums1[i] = nums2[i-m];
}
while(left<m+n && right<m+n)
{
if(nums1[left]>nums1[right])
{
temp = nums1[left];
nums1[left] = nums1[right];
nums1[right] = temp;
left++;
if(left == right)
{
right++;
}
}
else
{
left++;
}
}
}
printv(nums1,m+n);
}
下面代码为什么会报错???????因为结束标志理解错了,即结束标志为nums2插入完毕,所以n>0;或者nums1插入完毕,此时只需要把nums2剩余的数插入nums1剩下的位置就可以
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n)
{
int p1= m-1;
int p2 = n-1;
for(int p = m+n-1; p>=0;p--)
{
if(nums1[p1]>=nums2[p2] && p1>=0)
{
nums1[p] = nums1[p1];
p1--;
}
else
{
nums1[p] = nums2[p2];
p2--;
}
}
}
逆向双指针
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n)
{
int i = m+n;
while (n > 0)
{
if (m > 0 && nums1[m-1] > nums2[n-1])
{
nums1[--i] = nums1[--m];
}
else
{
nums1[--i] = nums2[--n];
}
}
}