一、题目描述
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。
二、思路
🍒思路1:
将一个数组放到另一个数组的后面,然后排序
🍒思路2:
两个数组中的内容进行比较,取小的放到新数组中,当一个数组走完了,将另一个数组剩下的内容放到新数组中即可
🍒思路3:
注意合并后的数组不是由函数返回而是存储再nums1中,所以思路2的方法不可行,并且题目中给了nums数组的长度是m+n
思路3分两种情况
🌸情况1:i2中数据先结束,剩下的数据就不需要动了
i2和i1进行从后向前比较,取大放到nums1中
![](https://img-blog.csdnimg.cn/img_convert/e316be045f36b4b5e763d82b0345cf97.png)
🌸情况2:nums1中数据先走完,nums2中的数据还没走完,num2中的数据还要继续拷贝到nums1中
![](https://img-blog.csdnimg.cn/img_convert/d88886a2c85e484bc82b98ef6711c8e8.png)
三、详解
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
int i1=m-1,i2=n-1,j=nums1Size-1;
while(i1>=0&&i2>=0)
{
if(nums1[i1]>nums2[i2])
{
nums1[j]=nums1[i1];
i1--;
j--;
}
else
{
nums1[j]=nums2[i2];
i2--;
j--;
}
}
while(i2>=0)
{
nums1[j]=nums2[i2];
i2--;
j--;
}
}