leetcode 88. 合并两个有序数组

22 阅读1分钟

两种解法 双指针

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

比较两组数组,将较大值放在数组1的末尾,swap

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        // 均为下标
        int index = m + n - 1;
        int i = m - 1;
        int j = n - 1;
        while(i >= 0 && j >= 0) {
            // 这个=在哪 对结果无影响
            if(nums1[i] >= nums2[j]) {
                swap(nums1[i], nums1[index]);
                i--;
            }
            else {
                swap(nums2[j], nums1[index]);
                j--;
            }
            index--;
        }
        // nums1为{3, 4, 5, 0, 0}
        // nums2为{1, 2}的情况
        // 这一步骤前{0, 0, 3, 4, 5}
        // index下标为1, i = -1, j = 1
        
        // 将nums2剩余部分附加在nums1上
        if(i == -1) {
            while(index >= 0) {
                nums1[index] = nums2[j];
                index--;
                j--;
            }
        }
    }
};