leetcode-88-合并两个有序数组


本题是leetcode,地址:88. 合并两个有序数组

题目

给你两个有序整数数组 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]

public void merge(int[] nums1, int m, int[] nums2, int n) {

}

分析

简单思路:nums1是参与排序的,同时也是排序的结果,这个有点不太好处理;如何解决呢?

我们很容易想到,把nums1 copy一份,然后对copy的操作,nums1的值直接覆盖,用双指针,使用了哪个指针的值,就让指针++;while终止条件就是++后的指针小于数组长度;如果一方已经遍历完毕,后续的数据就可以直接copy了;

code

    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int[] nums1_copy = new int[m];
        System.arraycopy(nums1,0,nums1_copy,0,m);

        int first = 0, second = 0;
        while(first < m && second < n) {
            int v1 = nums1_copy[first];
            int v2 = nums2[second];
            if(v1 < v2) {
                nums1[first + second] = v1;
                first ++;
            } else {
                nums1[first + second] = v2;
                second ++;
            }
        }
        if(first < m) {
            System.arraycopy(nums1_copy, first, nums1, first + second,m - first);
        }
        if(second < n) {
            System.arraycopy(nums2, second, nums1, first + second,n - second);
        }
    }

你的鼓励也是我创作的动力

打赏地址

posted @ 2020-07-21 10:57  Yangsc_o  阅读(107)  评论(0编辑  收藏  举报