先奉上oj链接:力扣https://leetcode.cn/problems/merge-sorted-array/
然后我们处理一下这道题。题中给我们的两个数组不是随便给的,是有要求的,第一个数组前面m个元素随便给,但是后面n个元素是0,然后第二个数组就有n个元素,意思是合并数组之后第一个数组后面的n个0就不要了,剩下的元素按照非递减排列。
这道题的思想的话,还是和上一道题移除元素的思想是一样的,都是采用双指针的的想法,分别取两个数组中的有效元素,因为第一个数组后面的元素是0,所以我们要从后往前插入元素,又因为合并之后的数组是非递减的,所以我们要比较有效元素,选大的插入到第一个数组的最后。因为我们需要分别定位两个数组的有效元素,并且还要从后往前插入元素,所以双指针已经不够用了,我们需要三个指针。具体实现过程可以参考下面的代码:
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
int* p1 = nums1+m-1;
int* p2 = nums2+n-1;
int* end = nums1+m+n-1;
while((p1-nums1+1)&&(p2-nums2+1))
{
if(*p1<*p2)
{
*end = *p2;
p2--;
end--;
}
else
{
*end = *p1;
p1--;
end--;
}
}
}
这里还要判断,如果有一个数组走完了应该怎么处理,如果第二个数组先走完,说明第一个数组还没进行比较的元素一定比第二个数组最小的元素还要小,那我们也不用处理了,直接放在原位就好了,如果第一个数组先走完,那么同理第一个数组中前面的元素我们需要替换成第二个数组中剩下内容。
if(nums1>p1)
{
while(p2-nums2+1)
{
*end = *p2;
p2--;
end--;
}
}
加上这样的处理之后逻辑就已经达成了,只需要把这两段连起来就可以了
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
int* p1 = nums1+m-1;
int* p2 = nums2+n-1;
int* end = nums1+m+n-1;
while((p1-nums1+1)&&(p2-nums2+1))
{
if(*p1<*p2)
{
*end = *p2;
p2--;
end--;
}
else
{
*end = *p1;
p1--;
end--;
}
}
if(nums1>p1)
{
while(p2-nums2+1)
{
*end = *p2;
p2--;
end--;
}
}
}
这样就大功告成了。