题目:
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
- 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
- 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
示例:
输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
解题方法:
因为nums1数组后面部分元素没有使用,所以从后向前合并数组可以减少数组元素移动的次数。
程序的主要流程:
- 判断nums1和nums2最大元素的大小,较大的数存进nums1的最后位置;
- 根据第一步更新下一个参与比较的数据,然后重复第一步;
- 循环结束以后,可能出现nums1还有数据没有用完,但是nums1本身就在最终的数组中,所以不需要再复制进数组了;也可能是nums2还没有用完,只需要把nums2剩余数据存进nums1就可以了。
代码和结果:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int p=m+n-1;
n--;
m--;
while(n>=0&&m>=0)
{
if(nums1[m]>nums2[n])
{
nums1[p]=nums1[m];
m--;
p--;
}
else
{
nums1[p]=nums2[n];
n--;
p--;
}
}
while(n>=0)
{
nums1[p]=nums2[n];
p--;
n--;
}
}
};
运行结果:
![](https://img.haomeiwen.com/i11138240/bba23f7237b2b6f5.png)
网友评论