思路就是从后往前遍历,避免一次挪动太多位。
/**
* @param {number[]} nums1
* @param {number} m
* @param {number[]} nums2
* @param {number} n
* @return {void} Do not return anything, modify nums1 in-place instead.
*/
var merge = function(nums1, m, nums2, n) {
if (m - 1 < 0) {
nums2.forEach((n, i) => nums1[i] = nums2[i]);
return;
}
for (let j = n - 1; j >= 0; j--) {
for (let i = m - 1; i >= 0; i--) {
if (nums2[j] >= nums1[i]) {
nums1[i + 1] = nums2[j];
break;
} else {
// 往后挪
nums1[i + 1] = nums1[i];
if (i === 0) {
// 到达第一位的时候将nums2的最后一位放上去
nums1[i] = nums2[j];
}
}
}
m++; // 每往nums1添加一位 m也跟着加1位
}
};