题目:给出两个有序的整数数组 A 和 B
,请将数组 B
合并到数组 A
中,变成一个有序的数组
注意:
可以假设 A数组有足够的空间存放 B
数组的元素, A
和 B
中初始的元素数目分别为 m
和 n.
这个题目的思路也比较有趣,由于A有足够的空间放B,而A和B的元素个数也是知道的,但是从前向后排的话,需要进行很多元素移动和中间保存的操作,效率很低,因此考虑从后往前排,因为在数组A中,从m-m+n这些位置是空闲的,所以考虑从后向前排序,从A的末尾元素i和B的末尾元素j开始进行比较,将较大的元素放在m+n的位置,对应的指针左移,重复上述步骤,最后如果B有剩余元素的话,则按顺序放到A的最前面即可。
完整代码如下:
public void merge(int A[], int m, int B[], int n) {
int i=m-1;
int j=n-1;
int len = m+n-1;
while(i>=0&&j>=0) {
if(A[i]>=B[j]) {
A[len] = A[i];
i--;
len--;
}else {
A[len] = B[j];
j--;
len--;
}
}
while(j>=0) {
A[len--] = B[j];
j--;
}
}