二刷
不用考虑合并到最后A是否会被覆盖
不会
因为从后面开始弄 永远不会覆盖到A 被覆盖的都是已经排好序的 没用的
public class Solution {
public void merge(int A[], int m, int B[], int n) {
int i=m-1;
int j=n-1;
while(i>=0 && j>=0){
if(A[i] > B[j]){
A[i+j+1] = A[i];
i--;
}
else{
A[i+j+1] = B[j];
j--;
}
}
while(j>=0) A[i+j+1] = B[j--];
}
}1.创造了一个新数组。
public class Solution {
public void merge(int A[], int m, int B[], int n) {
int [] merge = new int[m+n];
int i=0,j=0,k=0;
while(i<m && j<n){ // 注意这里要是&& 我之前是 || 会出问题
if(A[i]<B[j]){
merge[k] = A[i];
i++;
}
else{
merge[k] = B[j];
j++;
}
k++;
}
if(j==n){
for(;i<m;k++,i++){
merge[k] = A[i];
}
}
if(i==m){
for(;j<n;k++,j++){
merge[k] = B[j];
}
}
for(int count=0; count< m+n; count++ ){
A[count] = merge[count];
}
}
}2.因为给的题目已经扩充了 A 数组 因此 可以从 A数组屁股 从大到小进行排序, 这样节省空间。



京公网安备 11010502036488号