1. Problem Description
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.
Note:
You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2. The number of elements initialized in nums1 and nums2 are m and n respectively.
高效归并两个有序数组。
2. My solution1 (另开空间从前往后)
从前往后合并,用两个指针分被指向两个数组当前最小元素,需要另开辟一个数组。
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n)
{
int It1=0,It2=0,It=0;
vector<int>res;
while(It<m+n)
{
if(It1<m&&It2<n)
{
if(nums1[It1]<=nums2[It2])
res.push_back(nums1[It1++]);
else
res.push_back(nums2[It2++]);
It++;
}
if(It1>=m)
{
while(It2<n)
res.push_back(nums2[It2++]),It++;
break;
}
if(It2>=n)
{
while(It1<m)
res.push_back(nums1[It1++]),It++;
break;
}
}
nums1.clear();
for(int i=0; i<m+n; i++)
nums1.push_back(res[i]);
res.clear();
}
3. My solution2(in place归并,从后往前)
PS:
有一组样例是
nums1={0},m=0;
nums2={1],n=1.
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n)
{
int It1=m-1,It2=n-1,It=m+n-1;
for(int i=0; i<n+m-nums1.size(); i++)//z1!!!!!样例中存在m比实际size小的情况!!!!!
nums1.push_back(0);
while(It>=0)
{
if(It1>=0&&It2>=0)
{
if(nums1[It1]>=nums2[It2])
nums1[It--]=nums1[It1--];
else
nums1[It--]=nums2[It2--];
}
else if(It1<0)
{
while(It2>=0)
nums1[It--]=nums2[It2--];
break;
}
else
{
while(It1>=0)
nums1[It--]=nums1[It1--];
break;
}
}
}