原题:
Given two sorted integer arrays A and B, merge B into A as one sorted array.
合并两个有序的数列前面有一个是链表形式,而这个数组形式的非常相似,只是需要复制罢了。。。。
主要思想:
1 因为需要合并两个数组到A中,因此数组A会增加,从尾部直接考虑可以减少来回移动的时间
2 用一个指针指向新的数组的尾部,分别比较两个现有数组的尾部,大的放进来就ok
3 两个原数组分别用一个指针指向尾部,用于比较,若哪个指针(位置)为负数,说明该数组比较完毕,稍微处理就ok
如图所示:
图 说明
代码如下:
class Solution {
public:
void merge(int A[], int m, int B[], int n) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
//新数组的最后一个位置
int last = m+n-1;
//A的最后一个位置
int indexA = m-1;
//B的最后一个位置
int indexB = n-1;
for (int i = 0;i<m+n;i++){
last = m+n-i-1;
//两个index都为非负数,说明两个数组都没比较完,将大的放入新数组中
if(indexA >=0 && indexB >= 0){
if(A[indexA] > B[indexB]){
A[last] = A[indexA];
indexA--;
}
else{
A[last] = B[indexB];
indexB--;
}
}
//A数组已经比较完,将B数组剩下的都放进新数组
else if(indexA < 0){
A[last] = B[indexB];
indexB--;
}
//B数组比较完,直接break,节省时间
else {
break;
}
}
}
};