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

合并两个有序的数组

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

双指针思想

双指针指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个指针(特殊情况甚至可以多个),两个指针或是同方向访问两个链表、或是同方向访问一个链表(快慢指针)、或是相反方向扫描(对撞指针),从而达到我们需要的目的。

如何将两个有序的数组融合到第一个有序的数组中?

  • 由于题目中A已经扩容到可以容纳两个数组元素的容量了,多于的元素用了0作为占位符,所以在融合数组时,应该使用下标进行赋值替换操作,而不是用push来进行插入操作,因此需要第三个指针操作最终A数组的下标。
  • 由于要替换扩容后的A中的后面为0的占位符,所以元素比较应该从最后一个元素开始,因此初始的A和B的指针应该指向两者最后一个元素,依次遍历将较大的元素替换A中后面的元素。
  • 由于最后融合在A中,因此如果最后剩下A中的元素没有遍历完,它已经在A中有序了,无需继续遍历替换,但是如果B中还有元素,还应继续进行遍历替换操作将他们给替换掉。

参考

https://blog.nowcoder.net/n/374f83439d7c4541bf858642c29c144a?f=comment

https://blog.nowcoder.net/n/e6a478783bde4322ab489fc1ba3e6cdb?f=comment

/**
 * 
 * @param A int整型一维数组 
 * @param B int整型一维数组 
 * @return void
 */
function merge( A, m, B, n ) {
    // write code here
    // A和B都是有序的,从这两个数组的最后一个元素开始遍历,将两者中最大的元素依次放到A的末尾
    let i = n-1;
    let j = m-1;
    let k = n+m-1;  // 为了能直接将元素放入A中,而不用临时数组,需要第三个指针
    
    while (i >= 0 && j >= 0) {
        if (A[j] >= B[i]) {
            A[k--] = A[j--];
        }
        else {
            A[k--] = B[i--];
        }
    }

    while (i >= 0) {
        A[k--] = B[i--];  // 如果B中还有元素则继续放入A中,如果A中还有元素则剩下的元素已经在最终的A中有序了。
    }
}
module.exports = {
    merge : merge
};

全部评论

相关推荐

头像
11-21 11:39
四川大学 Java
是红鸢啊:忘了还没结束,还有字节的5k 违约金
点赞 评论 收藏
分享
投递大华股份等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务