题目描述:合并两个排序的整数数组A和B变成一个新的数组。
注意事项
你可以假设A具有足够的空间(A数组的大小大于或等于m+n)去添加B中的元素。
样例:给出 A = [1, 2, 3, empty, empty], B = [4, 5]
合并之后 A 将变成 [1,2,3,4,5]
思路:既然是合并有序的数组,那么我们肯定想到一个一个去比较,如果A的第一个数大于B的第一个数,就将A整体向后移动,然后将B的第一个数插入;如果A的第一个数小于B,那么就将A向后移动,看A第二个数和B第一个数的比较,以此类推。这种思路去实现的时候很容易出现问题,比如牵扯到拷贝的问题,比如可能会产生判断问题。
还有种思想就是既然它已经是有序的,我们可以从后向前进行比较,如果最后A最后一个都比B第一个小,那么就不需要移动A,直接将B插入到A的后面,如果A的最后一个比B大,那么它也比B中其他元素大,所以将它移动到最后,接着再去比较A的倒数第二个和B倒数第一个的大小。
到这里其实思路已经很明显了,在写代码之前,我们可以先将可能出现的测试用例写出来,比如:
A={9,10,11,12,13},B={4,5,6,7}
A={},B={1,2,3,4}
A={1,2,3},B={}
A={1,2,3},B={4,5,6}
所以代码如下:
void mergeSortedArray(int A[], int m, int B[], int n) {
// write your code here
int pos=m+n-1;
int i=m-1;
int j=n-1;
while(i>=0 && j>=0)
{
if(A[i]>B[j])
{
A[pos--]=A[i--];
}
else
{
A[pos--]=B[j--];
}
}
while(j>=0)
{
A[pos--]=B[j--];
}
}
紧接着,我们对这个面试题升级。
题目描述:合并两个排序的整数数组A和B变成一个新的数组。
样例
给出A=[1,2,3,4],B=[2,4,5,6],返回 [1,2,2,3,4,4,5,6]
思路:对这个题而言,既然是返回一个新的数组,那我们从头开始比较然后插入到新数组中。当其中一个数组已经插入完,那么另外一个数组可直接插入到新数组的后面。代码如下:
vector<int> mergeSortedArray(vector<int> &A, vector<int> &B) {
// write your code here
vector<int> res;
int s1=A.size();
int s2=B.size();
if(s1==0) return B;
if(s2==0) return A;
int i=0;
int j=0;
while(s1&&s2)
{
if(A[i]>B[j])
{
res.push_back(B[j]);
j++;
s2--;
}
else
{
res.push_back(A[i]);
i++;
s1--;
}
}
if(s2==0)
{
while(s1)
{
res.push_back(A[i]);
i++;
s1--;
}
}
if(s1==0)
{
while(s2)
{
res.push_back(B[j]);
j++;
s2--;
}
}
return res;
}