88. 合并两个有序数组

1.新开一个数组保存

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int [] sort=new int [m+n];
        int p1=0;
        int p2=0;
        int current=0;
        while( p1 < m || p2 < n){

            if(p1 == m){
                sort[current++]=nums2[p2++];
            }else if(p2 == n){
                sort[current++]=nums1[p1++];
            }else if(nums1[p1] <= nums2[p2]){
                sort[current++]=nums1[p1++];
            }else{
                sort[current++]=nums2[p2++];
            }
        }
        for(int j=0;j<m+n;j++){
            nums1[j]=sort[j];
        }
       
    }
}

因为时新开了一个数组来保存,所以空间复杂度是O(n+m);

var merge = function(nums1, m, nums2, n) {
    let sort=new Array(m+n);
    let p1=0;
    let p2=0;
    let current=0;
    while(p1<m || p2<n){
        //nums1数组已经比较完了
        if(p1===m){
            sort[current++]=nums2[p2++];
        }else if(p2 === n){
             sort[current++]=nums1[p1++];
        }else if(nums1[p1]<=nums2[p2]){
            sort[current++]=nums1[p1++];
        }else{
           sort[current++]=nums2[p2++];
        }
    }
    for(let j=0;j<m+n;j++){
        nums1[j]=sort[j];
    }
};

2.逆向双指针

后面的位置永远足够容纳被插入的元素,不会产生 p1 的元素被覆盖的情况。

var merge = function(nums1, m, nums2, n) {
   let p1=m-1;
   let p2=n-1;
   //更换元素的那个指针
   let tail=n+m-1;
   let cur=0;
   //这里注意下边界条件
   while(p1>=0 || p2>=0){
       if(p1===-1){
           cur=nums2[p2--];
       }else if(p2===-1){
           cur=nums1[p1--];
       }else if(nums1[p1]>=nums2[p2]){
           cur=nums1[p1--];
       }else{
           cur=nums2[p2--]
       }
       nums1[tail--]=cur;
   }  
};
posted @ 2021-05-23 14:57  看鱼游  阅读(37)  评论(0)    收藏  举报