leetcode 88 合并两个有序数组 JavaScript
思路:
方法一:
最简单的方法就是把nums2加入nums1,同时把nums1的0去掉,最后sort()排序即可 时间复杂度O((m+n)log(m+n))
代码如下:
/**
* @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) {
// for(let i = 0;i<nums2.length;i++){
// nums1[m+i] = nums2[i];
// }
// nums1.sort((a,b)=>a-b);
// };
var merge = function(nums1, m, nums2, n) {
nums1.splice(m,nums1.length-m,...nums2);
nums1.sort((a,b)=>a-b);
return nums1;
};
方法二:
利用三指针完成插入 设两个指针p1 p2分别指向nums1 nums2有数字的末尾(nums1后面那些0不算),也就是p1指向nums[m-1] p2指向nums2[n-1],
cur指向nums1最末尾的0。
(JavaScript没有指针,只是一个比喻 也就是p1 p2是对应的下标index
初始p1=m-1 p2 =n-1 cur=nums1.length-1)
while循环p1>=0,对比nums1[p1] nums2[p2]的值,若p2>=0且nums2[p2]大于nums1[p1],替换掉p1最末尾0的位置(比如nums1==[1,2,3,0,0,0],把nums2[p2]替换掉最后的0),否则nums1[p1]替换掉nums[1]最后的0,哪个替换了,哪个指针就向前移动,直到p2遍历完成 (简单来说就是 对比nums1[p1] nums2[p2],哪个大就哪个和num1后面的0互换位置)
考虑到nums2更短,思路一致但换成:while循环p2>=0,若nums1[p1]大于nums2[p2]且p1>=0 替换cur和p1…以此类推
时间复杂度O(m+n)
代码如下:
var merge = function(nums1, m, nums2, n) {
let p1 = m-1;
let p2 = n-1;
let cur = nums1.length-1;
while(p2>=0){
if(p1>=0&&nums1[p1]>nums2[p2]){
nums1[cur--] = nums1[p1--];
}
else{
nums1[cur--] = nums2[p2--];
}
}
};