88. 合并两个有序数组

难度 easy
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。

初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。

示例 1:

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
示例 2:

输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]

提示:

nums1.length == m + n
nums2.length == n
0 <= m, n <= 200
1 <= m + n <= 200
-109 <= nums1[i], nums2[i] <= 109

解题思路:这道题是非常简单的,因为nums1的大小都给出来了,所以我们只要用归并排序的思路把nums2的元素添加到nums1中即可,我们选择从后往前遍历,这样新添加进来的元素就自然地添加到数组末端了,我们就不用考虑从前往后添加的过程中涉及的顺序改变的问题了。

代码 t100 s15 java

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        if(n==0) return;
        if(m==0){
            for(int k=0; k<n; k++){
                nums1[k] = nums2[k];
            }
            return;
        }
        int p1 = m-1, p2 = n-1;
        for(int i=m+n-1; i>=0; i--){
            if(p1<0 || p2<0) break;
            if(nums1[p1]>=nums2[p2]){
                nums1[i] = nums1[p1];
                p1--;
            }else{
                nums1[i] = nums2[p2];
                p2--;
            }
        }
        if(p1<0){
            for(int j=p2; j>=0; j--){
                nums1[j] = nums2[j];
            }
        }
    }
}

下面的题解是7个月前提交的cpp版本,应该是参考了网上的资料写的,十分简洁,思路一样的。

代码 t64 s12 cpp

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int k=m+n-1, i=m-1, j=n-1;
        while(j>=0){
            nums1[k--] = (i>=0 && nums1[i] > nums2[j]) ? nums1[i--] : nums2[j--];
        }
    }
};
上一篇:实验一


下一篇:【学习笔记】深入理解js原型和闭包(8)——简述【执行上下文】上