这道题很容易就想到归并排序;但事实上这里并不需要开辟额外的空间,因为A已经给出了m+n长度的空间,所以直接从A的右往左移即可。易证i<=k恒成立
class Solution {
public:
void merge(int A[], int m, int B[], int n) { //看题目感觉是让写插入排序-如何利用两个都是有序-从小到大的条件
int i,j,k;
//从后面开始往前就可以避免大量移动
i=m-1;j=n-1;k=m+n-1;
while(i>=0 or j>=0){
if((i>=0 and A[i] >=B[j]) or j<0){ //当j<0了说明B已经放完了,但i还没有到0,这时候只需要继续将剩下的元素
//填充到A剩余的位置即可
A[k--]=A[i--];
}
else{
A[k--]=B[j--]; //就算B全部都比A大,k一直走也只会到(m+n)-n+1=m+1个数,即下标到m
//而上面的K和i走的时候是同步的。
}
}
}
};