88. 合并两个有序数组 + 合并数组 + 双指针

88. 合并两个有序数组

LeetCode_88

题目描述

方法一:暴力法

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        for(int i=0, j=0; j<n;){
            if(i >= m ){
                nums1[i] = nums2[j];
                i++;
                j++;
            }else{
                if(nums1[i] > nums2[j]){
                    insert(i, nums2[j], nums1, m++);
                    i++;
                    j++;
                }else i++;
            }
            
        }

    }
    public void insert(int pos, int val, int[] nums1, int num){
        for(int i = num; i>pos; i--){
            nums1[i] = nums1[i-1];
        }
        nums1[pos] = val;
    }
}

方法二:双指针法

  1. 考虑到这两个数组都是有序的数组,而且nums1后面留有空余的位置。
  2. 可以从尾开始遍历,依次向nums1的尾部填写元素。
class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int k = m + n -1;
        int ptr1 = m-1, ptr2 = n-1;
        while(ptr1 >= 0 || ptr2 >= 0){
            if(ptr1 < 0){
                nums1[k] = nums2[ptr2];
                ptr2--;
            }else if(ptr2 < 0){
                nums1[k] = nums1[ptr1];
                ptr1--;
            }else{
                if(nums1[ptr1] < nums2[ptr2]){
                    nums1[k] =  nums2[ptr2];
                    ptr2--;
                }else{
                    nums1[k] = nums1[ptr1];
                    ptr1--;
                }
            }
            k--;
        }
    }
}
class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int p = m+n-1;
        int p1 = m-1;
        int p2 = n-1;
        while(p2 >= 0){//注意循环的条件,这里一定是p2>=0,否则出错
            if(p1 >= 0 && nums1[p1] > nums2[p2]){
                nums1[p] = nums1[p1];
                p--;
                p1--;
            }else{
                nums1[p] = nums2[p2];
                p--;
                p2--;
            }
        }
    }
}
posted @ 2021-03-14 11:24  Garrett_Wale  阅读(106)  评论(0编辑  收藏  举报