LeetCode 每日一题 88. 合并两个有序数组

Published by rcdfrd on 2022-12-22

88. 合并两个有序数组

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

Output: [1,2,2,3,5,6]

题目描述:把归并结果存到第一个数组上。

需要从尾开始遍历,否则在 nums1 上归并得到的值会覆盖还未进行归并比较的值。

代码:

语法糖版本:

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        nums1.erase(nums1.begin() + m, nums1.end());
        copy(nums2.begin(), nums2.end(), back_inserter(nums1));
        sort(nums1.begin(), nums1.end());
    }
};

双指针版:

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        vector<int> v(nums1);
        int i = m - 1, j = n - 1, k = m + n - 1;
        while(i >= 0 && j >= 0 && k >= 0)
        {
            if(nums1[i] > nums2[j])
            v[k--] = nums1[i--];
        else
            v[k--] = nums2[j--];
        }
        while(j >= 0 && k >= 0) v[k--] = nums2[j--];
        nums1 = v;
    }
};