88. Merge Sorted Array

Given two sorted integer arrays nums1 and nums2 , merge nums2 into nums1 as one sorted array.

Note:

The number of elements initialized in nums1 and nums2 are m and n respectively.
You may assume that nums1 has enough space (size that is greater or equal to m + n ) to hold additional elements from nums2.
Example:

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

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

/**
 * @param {number[]} nums1
 * @param {number} m
 * @param {number[]} nums2
 * @param {number} n
 * @return {void} Do not return anything, modify nums1 in-place instead.
 */
var merge = function(nums1, m, nums2, n) {
    var right = n - 1;
    var left = m - 1;
    var i = nums1.length - 1;
    while (right >= 0 && left >= 0) {
        if (nums2[right] > nums1[left]) {
            nums1[i] = nums2[right];
            right--;
        } else {
            nums1[i] = nums1[left];
            left--;
        }
        i--;
    }
    while(right >=0) {
        nums1[i] = nums2[right];
        right--;
        i--;
    }
};

混合插入有序数组,由于两个数组都是有序的,所有只需要按顺序比较大小,然后nums1的数组是足够大的,所以从nums1和nums2的数组末尾一个一个进行比较,把较大的数按顺序加入混合之后的末尾。需要三个变量left,right,和i,分别只想nums1、nums2和混合数组的末尾。进行while循环。如果left和right都大于等于0,那么再看nums1[left]和nums2[right],如果nums1[left] > nums2[right],则把nums1[left]插入混合数组的末尾,然后i--,left--;反之就把nums[right]加入混合数组的末尾,然后right和i都--;循环结束后,有可能left或者right还大于等于0;若right还大于等于0,那还要接着循环,将nums2中的数字继续考入nums1;若left大于等于0那就不用管,因为混合数组本身就存在nums1中。
更为简洁的代码如下

var merge = function(nums1, m, nums2, n) {
    var left = m - 1;
    var right = n - 1;
    var k = m + n - 1;
    while(right >= 0) {
        nums1[k--] = (left >=0 && nums2[right] < nums1[left]) ? nums1[left--] : nums2[right--]
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容