题解 | #合并两个有序的数组#

合并两个有序的数组

http://www.nowcoder.com/practice/89865d4375634fc484f3a24b7fe65665

/**
 1.正常思路: 
 合并两个数组的正常操作 是:新建一个能容纳 这两个数组的 新数组
 再依次遍历 两个数组,当前最小值 是谁 就取谁
 再移动指针 再比较,直到一个数组取完后,把剩下的数组拼接到已有数组;
 
 2.此题中明确要求 不返回新数组,数据合并到数组A[]中,
 又 A的空间足够大,所以合并过程只能放在A中进行,
 显然比较后的数组放到A数组末尾 才合理
 于是:有每次比较AB数组最大数,取最大数放置于A数组末尾
 一个数组取完后,剩下数组依次复制到 A数组中
 若两个数组处理完之后,A数组还有剩余空间未被填充,则移动数据是的靠前
*/
public class Solution {
    public void merge(int A[], int m, int B[], int n) {
        int ia = m - 1;
        int ib = n - 1;
        int aLastIdx = A.length - 1;
        // 依次处理 直到一个数组耗尽
        while (ia >= 0 && ib >= 0) {
            if( A[ia] >= B[ib] ) {
                A[aLastIdx--] = A[ia--];
            } else {
                A[aLastIdx--] = B[ib--];
            }
        }
        // A数组 未耗尽
        while( ia >= 0 ) {
            A[aLastIdx--] = A[ia--];
        }
        // B数组 未耗尽
        while( ib >= 0 ) {
            A[aLastIdx--] = B[ib--];
        }
        // 至此 AB数组 均耗尽,判断新数组A,前方是否有剩余空间
        // 若AB刚好填充完 新数组A,那么,此时aLastIdx 值 为 -1
        // 若有空缺则 aLastIdx >= 0
        // 把最后减掉的索引加回来,则 
        // 若AB刚好填充完 新数组A,那么,此时aLastIdx 值 为 0
        // 若有空缺则 aLastIdx > 0
        aLastIdx = aLastIdx + 1;
        if( aLastIdx > 0 ) {
            // 数组前移动, 原有位置 重置为 0
            for (int aFrontIdx = aLastIdx; aFrontIdx < A.length; aFrontIdx++ ) {
                A[aFrontIdx - aLastIdx] = A[aFrontIdx];
                A[aFrontIdx] = 0;
            }
        }
    }
}
全部评论

相关推荐

点赞 评论 收藏
分享
Java抽象带篮子:难蚌,点进图片上面就是我的大头😆
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务