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--]
}
}