题目描述
给你两个按非递减顺序排列的整数数组nums1
和nums2
,另有两个整数m
和n
,分别表示nums1
和nums2
中的元素数目。请你合并nums2
到nums1
中,使合并后的数组同样按非递减顺序排列。
注意:由于最终的合并数组是nums1
,所以nums1
的初始长度为m+n
。其中前m
个元素表示应合并的元素,后n
个元素为 0,应忽略
下面是题目的链接
示例
假设nums1=6,8,9 nums2=7,10
,所以m=5,n=2
则最终输出nums1=6,7,8,9,10
思路讲解
以前我们做过类似的合并数组的题目,那时我们会开辟一个新空间,两个数组相互比较,将较小项依次放入新数组,最后输出新数组。
而这里的话,我们采取一个更加巧妙的方法,不用开辟额外空间。我们将采用:三下标法
具体思路是这样的:这里我们不能通过两个数组比较,将较小值放在nums1
的前面,这有可能会覆盖了nums1
的值。但是我们可以反过来,先将较大值放在nums1
的最后面
- 定义三个下标
i1 i2 j
,分别是nums1
的最后一个元素的下标、nums2
的最后一个元素的下标、nums1
的末尾的下标 - 我们让
nums1[i1]
和nums2[i2]
进行比较 - 如果
nums1[i1]>nums2[i2]
,那么就nums1[j]=nums1[i1]
,同时j--、i1--
;反之同理 - 直到
i2<0
,说明合并完成。
下面是详细的步骤图:
具体代码实现:
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)//这里的nums1Size和nums2Size是冗余参数
{
int i1 = m-1;
int i2 = n-1;
int j = m+n-1;
while (i1 >= 0 && i2 >= 0)
{
if (nums1[i1] > nums2[i2])
{
nums1[j] = nums1[i1];
j--;
i1--;
}
else
{
nums1[j] = nums2[i2];
j--;
i2--;
}
}
while (i2 >=0 )
{
nums1[j] = nums2[i2];
j--;
i2--;
}
}