[LeetCode] 88. 合并两个有序数组

88. 合并两个有序数组

难度:Easy

题目描述:

给你两个有序整数数组 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. 合并再排序:
先把两个数组合并为一个,然后直接排序。

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        for(int n:nums2)
            nums1[m++] = n;
        sort(nums1.begin(),nums1.end());
    }
};

2. 复制nums1, 然后依次插入:
先把nums1复制到temp数组中,然后对temp nums2依次插入到num1中

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {   
        vector<int> temp(nums1);       //初始化m为nums1的拷贝
        int i = 0, j = 0, k = 0;

        while(i <= m-1 && j <= n-1)
        {
            if(temp[i] < nums2[j])                nums1[k++] = temp[i++];
            else               nums1[k++] = nums2[j++];
        }
        while(i <= m-1)         
        {
            nums1[n+i] = temp[i];
            i++;
        }
         while(j <= n-1)
        {
            nums1[m+j] = nums2[j];
            j++;
        }

    }
};

3. 从后向前

  • 用一个指针指向m+n-1的位置,也就是排满nums1中的最后一个位置。
  • 然后两个数组从最后一位比较,大的放到最后的位置。
  • 注意要额外判断第一个数组全部已经排到后面的情况。
class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        
        int last = m + n - 1;   // 指向nums1中m+n个数的末尾
        
        while(n > 0){
            if(m == 0){     // 第一个数组处理完毕了
                nums1[last] = nums2[--n];        
            }
            else if(nums1[m - 1] > nums2[n - 1]){
                nums1[last] = nums1[--m];           
            }else{
                nums1[last] = nums2[--n];
            }
            
            last--;
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值