合并排序的数组

214 阅读1分钟

题目描述

leetcode-cn.com/problems/so…

分析

观察两个数组,明显有两种解法 -> 正序双指针,倒叙双指针

对于正序:因为要覆盖元素,因此需要额外的空间 对于倒叙,长数组后面有多余为止可以存储元素,不需要额外的空间

因此我的方式是双指针倒叙法排序

算法

双指针

归并排序(合并阶段)

过程

设置变量

p1, p2 分别为两个数组遍历时用的指针,刚开始均指向最后一个位置

tail 为合并的当前位置

说明

合并的数组是长数组 A,这个我在本题的归并排序算法中比较特殊的地方

合并

按照升序的归并方法,进行元素的合并

代码

/**
 * @param {number[]} A
 * @param {number} m
 * @param {number[]} B
 * @param {number} n
 * @return {void} Do not return anything, modify A in-place instead.
 */
var merge = function(A, m, B, n) {
    let p1 = m - 1, p2 = n - 1, tail = m + n - 1
    
    while (p1 >= 0 || p2 >= 0) {
        if (p1 < 0 || (p2 >= 0 && B[p2] >= A[p1])) {
            A[tail--] = B[p2--]
        } else {
            A[tail--] = A[p1--]
        }
    }
    
    return A
};