题目


代码
我思路比较简单粗暴,直接把nums2拼到nums1后面一半全是0的地方,之后调用array的sort。
这个的时间复杂度是O(nlogn)。
javascript
/**
* @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 (n === 0) return
let ptr2 = 0
for (let i = m; i < nums1.length; i++) {
nums1[i] = nums2[ptr2]
ptr2++
}
nums1.sort((a, b) => a - b)
};
题解代码学习
因为 nums1 的空间都集中在后面,所以从后向前处理排序 的数据会更好,节省空间,一边遍历一边将值填充进去。
设置指针 len1 和 len2 分别指向 nums1 和 nums2 的有数字尾部,从尾部值开始比较遍历,同时设置指针 len 指向 nums1 的最末尾,每次遍历比较值大小之后,则进行填充。
当 len1<0 时遍历结束,此时 nums2 中海油数据未拷贝完全,将其直接拷贝到 nums1 的前面,最后得到结果数组。
时间复杂度:O(m+n)
javascript
/**
* @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) {
let p = m - 1, q = n-1, tail = m + n - 1
let cur
while (p > -1 || q > -1) {
if (p === -1) {
cur = nums2[q]
q--
} else if (q === -1) {
cur = nums1[p]
p--
} else if (nums1[p] >= nums2[q]) {
cur = nums1[p]
p--
} else if (nums1[p] < nums2[q]) {
cur = nums2[q]
q--
}
nums1[tail] = cur
tail --
}
return nums1
};