面试经典 150 题 1 —(数组 / 字符串)— 88. 合并两个有序数组

88. 合并两个有序数组

面试经典 150 题 1 —(数组 / 字符串)— 88. 合并两个有序数组_第1张图片

面试经典 150 题 1 —(数组 / 字符串)— 88. 合并两个有序数组_第2张图片

方法一:
class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        for(int i = 0; i<n;i++){
            nums1[m+i] = nums2[i];
        }
        sort(nums1.begin(),nums1.end());
    }
};
方法二:
class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        nums1.erase(nums1.begin()+m,nums1.end());
        nums2.erase(nums2.begin()+n,nums2.end());
        vector<int> tmp;
        while (n && m) {
            if (nums1.front() <= nums2.front()) {
                tmp.push_back(nums1.front());
                nums1.erase(nums1.begin());
                m--;
            } else {
                tmp.push_back(nums2.front());
                nums2.erase(nums2.begin());
                n--;
            }
        }

        if (!m) {
            tmp.insert(tmp.end(), nums2.begin(), nums2.end());
            nums1 = tmp;
        }
        if (!n) {
            tmp.insert(tmp.end(), nums1.begin(), nums1.end());
            nums1 = tmp;
        }
    }
};
方法三:性能最好
class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int p1 = 0, p2 = 0;
        int sorted[m + n];
        int cur;
        while (p1 < m || p2 < n) {
            if (p1 == m) {
                cur = nums2[p2++];
            } else if (p2 == n) {
                cur = nums1[p1++];
            } else if (nums1[p1] < nums2[p2]) {
                cur = nums1[p1++];
            } else {
                cur = nums2[p2++];
            }
            sorted[p1 + p2 - 1] = cur;
        }
        for (int i = 0; i != m + n; ++i) {
            nums1[i] = sorted[i];
        }
    }
};

你可能感兴趣的:(leetcode,面试,c++,leetcode)