LeetCode——88. 合并两个有序数组

文章目录

    • 88. 合并两个有序数组
      • 题目
      • 思路
      • 代码
        • 1、直接copy再sort(耍赖做法)
        • 2、双指针法
        • 3、奇妙法:双指针从后往前遍历比较

88. 合并两个有序数组

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目

给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。

说明:
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。

示例:
输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
输出: [1,2,2,3,5,6]

思路

1、直接copy再sort(耍赖做法)
将nums2直接copy到nums1中,再对nums1排序

public static native void arraycopy(Object src,  int  srcPos, Object dest, int destPos,int length);
参数:
    src:要复制的数组(源数组)
    srcPos:复制源数组的起始位置
    dest:目标数组
    destPos:目标数组的下标位置
    length:要复制的长度

2、双指针法
定义p1、p2分别指向nums1和nums2的当前下标,比较两者nums1[p1] 和nums2[p2],将较小的值加入中间数组temp,当一个数组加入完毕,将剩下的那个数组元素直接加入temp。最终将temp元素copy到nums1即可

3、奇妙法:双指针从后往前遍历比较
类似2的思想,不过从后往前加入元素不用借助中间数组temp,直接用p来指向最终数组nums1的下标进行操作即可,此时选取两者间较大者加入nums1尾,依次倒序加入。

代码

1、直接copy再sort(耍赖做法)

/*
函数的使用
*/
class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        System.arraycopy(nums2,0,nums1,m,n);
        Arrays.sort(nums1);//只能做升序排序
    }
}

2、双指针法

/*
双指针法 + System.arraycopy
*/
class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int p1=0,p2=0,index=0;
        int []temp = new int[m+n];
        while(p1 < m && p2 < n){
            if(nums1[p1] <= nums2[p2]){
                temp[index++] = nums1[p1++];
            }
            else{
                temp[index++] = nums2[p2++];
            }
        }
        while(p1 < m){
            temp[index++] = nums1[p1++];
        }
        while(p2 < n){
            temp[index++] = nums2[p2++];
        }
        System.arraycopy(temp,0,nums1,0,m+n);
    }
}

3、奇妙法:双指针从后往前遍历比较


/*
奇妙法:双指针从后往前遍历比较
*/
class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int p1=m-1,p2=n-1,p = m+n-1;
        while(p1 >= 0 && p2 >= 0){
            if(nums1[p1] >= nums2[p2]){
                nums1[p--] = nums1[p1--];
            }
            else{
                nums1[p--] = nums2[p2--];
            }
        }
        while(p1 >= 0){
            nums1[p--] = nums1[p1--];
        }
        while(p2 >= 0){
            nums1[p--] = nums2[p2--];
        }
        // System.arraycopy(temp,0,nums1,0,m+n);
    }
}


你可能感兴趣的:(LeetCode刷题笔记)