合并两个有序数组

本文介绍了如何合并两个有序整数数组,包括使用七大排序中的插入排序,数组复制后的排序,以及双指针法。通过具体实例和代码解释了不同方法的实现过程,探讨了它们的时间复杂度和空间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://leetcode-cn.com/problems/merge-sorted-array/
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
示例:

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


方法一:合并后,七大排序
这个方法有点生硬,我将nums2数组拷贝到nums1后面,然后得到一个无顺序的数组,这个时候我们学过的七大排序就派上用场了,这里我采用插入排序为例子

class Solution {
    public  void merge(int[] nums1, int m, int[] nums2, int n) {
        if (n == 0){
            return;
        }
        for (int i = 0; i < nums2.length; i++) {
            nums1[m + i] = nums2[i];
        }
        insertSort(nums1,m + n);
    }
    public  void insertSort(int[] array,int length){
    	//这是插入排序
        for (int bound = 1; bound < length; bound++) {
            int tmp = array[bound];
            int cur = bound - 1;
            for(;cur >=0;cur--){
                if (array[cur] > tmp){
                    array[cur + 1] = array[cur];
                }else {
                    break;
                }
            }
            array[cur + 1] = tmp;
        }
    }
}

时间复杂度:O(N^2)
空间复杂度:O(1)
我写过的关于七大排序的博客:https://blog.youkuaiyun.com/question_mark/article/details/103045910


方法二:合并后排序
看到了力扣的官方解答,这也太简洁了吧

arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
Copies an array from the specified source array, beginning at the specified position, to the specified position of the destination array.
意思是,将src数组拷贝到dest目标数组,从0(srcPos)开始拷贝,拷贝到目标数组从m(destPos)开始拷贝,拷n这么长

	public  void merge(int[] nums1, int m, int[] nums2, int n) {
        System.arraycopy(nums2,0,nums1,m,n);
        Arrays.sort(nums1);//排序
    }

时间复杂度 : O((n+m)log(n+m))。
空间复杂度 : O(1)。


方法三:双指针法
这个方法有点类似合并两个有序链表
https://blog.youkuaiyun.com/question_mark/article/details/102285426
也是用两个指针,一个指向nums1(Copy),一个指向nums2,比较大小然后放入nums1中
具体实现代码如下:

 	public  void merge(int[] nums1, int m, int[] nums2, int n) {
        int[] nums1Copy = new int[m];
        //将nums1新拷贝一份
        System.arraycopy(nums1,0,nums1Copy,0,m);

        //两个指针,一个指向nums1Copy,一个指向nums2
        int p1 = 0;
        int p2 = 0;

        int p = 0;//指向nums1最终要输出的
        while ((p1 < m) && (p2 < n)){
            nums1[p++] = (nums1Copy[p1] < nums2[p2])? nums1Copy[p1++] : nums2[p2++];
        }
        if (p1 < m)
            System.arraycopy(nums1Copy, p1, nums1, p, m - p1);
        if (p2 < n)
            System.arraycopy(nums2, p2, nums1, p ,n - p2);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值