题目描述
分析
观察两个数组,明显有两种解法 -> 正序双指针,倒叙双指针
对于正序:因为要覆盖元素,因此需要额外的空间 对于倒叙,长数组后面有多余为止可以存储元素,不需要额外的空间
因此我的方式是双指针倒叙法排序
算法
双指针
归并排序(合并阶段)
过程
设置变量
设 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
};