题目
- 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
说明:
初始化 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]
思路1:使用额外空间
- 建立一个新的数组,逐个取出nums1,nums2数组中元素进行比较,把小的元素加入新数组。
- 然后考虑两个数组是否有剩余情况,把剩余的元素都加在新数组末尾
- 将新数组都元素赋值给nums1
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
vector<int> result;
int p1=0,p2=0;
//遍历两个数组,把小的数字插入新数组
while(p1<m&&p2<n)
{
if(nums1[p1]<nums2[p2])
result.push_back(nums1[p1++]);
else
{
result.push_back(nums2[p2++]);
}
}
//如果数组1有剩余,将剩下的数字插入新数组
if(p1!=m)
{
while(p1<m)
{
result.push_back(nums1[p1++]);
}
}
//如果数组2有剩余,将剩下的数字插入新数组
if(p2!=n)
{
while(p2<n)
{
result.push_back(nums2[p2++]);
}
}
nums1=result;
}
思路2:不使用额外空间
- 由于合并后数组大小为m+n,nums1后面并无元素,可以考虑从后往前赋值,比较nums1,nums2两个数组都最后一个元素,将最大元素插入到nums1的m+n-1位置上
- 依次向前比较,直到循环结束。
- 特殊情况,nums2循环完了,如果nums1中所有元素都比nums2小,直接结束。如果 nums1循环完,nums2中还有元素没有加入,直接将nums2剩下元素赋值给nums前面。
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
//新数组的最后一个元素下标
int index=m+n-1;
//设两个指针分别指向数组1和2的末尾
int p1=m-1,p2=n-1;
while(p1>=0 && p2>=0)
{
if(nums1[p1]<nums2[p2]){
nums1[index--]=nums2[p2--];
}
else{
nums1[index--]=nums1[p1--];
}
}
if(p1>=0)
{
while(p1>0)
nums1[index--]=nums1[p1--];
}
if(p2>=0)
{
while(p2>=0)
nums1[index--]=nums2[p2--];
}
}