【LeetCode】88. 合并两个有序数组

88. 合并两个有序数组

题目描述

在这里插入图片描述

方法一:合并后排序

  • 先将nums2并入nums1中,再对nums1进行排序。(这里用的是选择排序法)
var nums1Length=m+n,temp,minIndex;
	// 合并
    if(nums2.length==0)
        return nums1;
    while(m<nums1Length){
        nums1[m]=nums2[n-1];
        m++;
        n--;
    }
    // 排序
    for(let i=0;i<nums1Length-1;i++){
        var minIndex=i;
        for(let j =i+1;j<nums1Length;j++){
            if(nums1[j]<nums1[minIndex])
                minIndex=j;
        }
        if(i!=minIndex){
            temp=nums1[i];
            nums1[i]=nums1[minIndex];
            nums1[minIndex]=temp;
        }
    }
    return nums1;
};


复杂度分析:

  • 时间复杂度: O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度: O ( 1 ) O(1) O(1)

方法二:双指针

从后往前遍历,把大的数放到数组nums1的后面:

  • 因为nums1nums2都是升序的,所以我们设置两个指针len1=m-1指向nums1最后一个数字、len2=n-1指向nums2最后一个数字,len=nums.length-1指向nums1的最后一个位置;
  • 从后向前比较nums1[len1]nums2[len2]
  • nums1[len1] > nums2[len2] ,那么nums1[len]=nums1[len1];len1--;len-- ; 反之nums1[len]=nums2[len2];len2--;len--;直到len1len2小于0;
  • len1小于0,则直接返回nums1,若len2小于0,则将len2中剩余的数填入nums1中,最后返回nums1

                                                          *图片来自瓶子君

/**
 * @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) {
    var len=nums1.length-1,len1=m-1,len2=n-1;
    while(len1>=0&&len2>=0){
        if(nums1[len1]>nums2[len2]){
            nums1[len]=nums1[len1];
            len1--;
        }
        else {
            nums1[len]=nums2[len2];
            len2--; 
        }
        len--;
    }
    if(len1<0){
        while(len2>=0){
            nums1[len]=nums2[len2];
            len2--;
            len--;
        }
        return nums1;
    }
    else{
        return nums1;
    }
};


复杂度分析:

  • 时间复杂度: O ( m + n ) O(m+n) O(m+n)
  • 空间复杂度: O ( 1 ) O(1) O(1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值