Merge Sorted Array

题目地址:https://leetcode.com/problems/merge-sorted-array/

Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.

Note:
You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2. The number of elements initialized in nums1 and nums2 are m and n respectively.

这个题目与合并有序链表的思路一样,都是比较元素值的大小,然后插入到新的数组中。

如果直接在元数组中插入也行(题目已经告诉我们了空间管够),但是数组插入后需要移动后面的元素,这个操作比较耗时,所以尽量避免这种操作。

public class MergeSortedArray {
    public static void merge(int[] nums1, int m, int[] nums2, int n) {
        int[] r = new int[m + n];
        int k = 0;
        int i = 0, j = 0;

        //  将值小的插入到前面
        for (; i < m && j < n;) {
            if (nums1[i] < nums2[j]) {
                r[k++] = nums1[i];
                i++;
            } else if (nums1[i] == nums2[j]) {
                r[k++] = nums1[i];
                r[k++] = nums2[j];
                i++;
                j++;
            } else {
                r[k++] = nums2[j];
                j++;
            }
        }

        // 处理剩下的元素
        if (i < m) {
            for (int p = 0; p < m - i; p++) {
                r[n + p + i] = nums1[i + p];
            }
        }

        if (j < n) {
            for (int p = 0; p < n - j; p++) {
                r[m + j + p] = nums2[j + p];
            }
        }

        // 复制数组,耗时O(n)
        System.arraycopy(r, 0, nums1, 0, m + n);
    }

    public static void main(String[] args) {
        /*int[] num1 = {1,4,5,6,9,13,0,0,0,0,0,0,0,0,0,0,0};
        int[] num2 = {1,2,3,4,5,9,12,14,14,18,30};*/

        int[] num1 = {};
        int[] num2 = {};
        merge(num1, 0, num2, 0);

        for (int n : num1)
            System.out.print(n + " ");
    }
}

时间复杂度为O(m+n),其中m,n是两个数组的大小,附加空间大小也为O(m+n)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值