(C++)Leetcode狂刷200题——标签“数组篇--简单难度10道 #88. 合并两个有序数组

本文介绍了一种使用双指针技术解决LeetCode上合并两个有序数组问题的方法。通过两种不同的双指针策略——头插尾法和尾插尾法,实现了在O(n+m)时间复杂度和O(1)空间复杂度下将两个有序数组合并为一个有序数组的目标。

在这里插入图片描述

第六题、#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]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法一、(头插“尾”法)、时间复杂度O(n+m) 、空间复杂度O(1)
将nums2的头部元素插入到nums1的第一个空位置,然后冒泡放入合适位置

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        for(int i = 0; i < n; i++){
            int k = m+i;   //从nums1的第一个空元素开始插入
            nums1[k] = nums2[i];    //将nums2的第一个元素插入到nums1的第一个空元素位置
            while(k > 0 && (nums1[k-1]>nums1[k])){//比较大小,冒泡放在合适位置
                swap(nums1[k-1],nums1[k]);
            k--;  //交换位置后继续向前比较
            }   
        }
    }
};

方法二、(尾插尾法)、时间复杂度O(n+m) 、空间复杂度O(1)

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int nums1_size = nums1.size();
        
        nums1_size--; //指向nums1的最后一个元素
        m--;   //指向nums1的最后一个非空元素
        n--;   //指向nums2的最后一个元素
        while(n>=0){   //直到nums2的元素插入完为止
            while(m >= 0 && nums1[m]>nums2[n]){   //当nums1的尾部的值大于要插入的值时
            swap(nums1[m--],nums1[nums1_size--]);// 将nums1的值交换到最后端
        }   
            swap(nums1[nums1_size--] , nums2[n--]); //将nums2插入到合适位置
        }  
    }
};
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值