/**
* 给你两个有序整数数组 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
*
* 解题思路一(merge1):
* 1. 长度为m+n的数组sorted,存储最终数组。
* 2. 利用排序数组特性,把nums1,nums2看作2个队列,分别从2个队列中取小值。
* 3. 用两个指针p1,p2分别作为2个指针的头部。
* 时间复杂度:O(m+n)。
* 指针移动单调递增,最多移动 m+n 次,因此时间复杂度为 O(m+n)。
* 空间复杂度:O(m+n)。
* 需要建立长度为 m+n 的中间数组 sorted。
*
* 解题思路二:
* 1.与思路一相比,在空间上可以稍作优化。
* 2.逆向双指针,由于nums1后半部分是空的,我们可以指针设置从后向前遍历。(逆向双指针)
* 3.取较大者放进nums1的后面。
*/
/**
* @param {number[]} nums1
* @param {number} m
* @param {number[]} nums2
* @param {number} n
* @return {void} Do not return anything, modify nums1 in-place instead.
*/
// var merge1 = function(nums1, m, nums2, n) {
// let p1 = 0;p2 = 0;
// const sorted = new Array(m+n).fill(0);
// var 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(let i=0;i!=m+n;++i){
// nums1[i] = sorted[i];
// }
// };
var merge = function(nums1, m, nums2, n) {
let p1 = m-1;p2 = n-1,tail = m+n-1;
var cur;
while(p1>=0||p2>=0){
if(p1 == -1){
cur = nums2[p2--];
}else if(p2 == -1){
cur = nums1[p1--];
}else if(nums1[p1]>nums2[p2]){
cur = nums1[p1--];
}else{
cur = nums2[p2--];
}
nums1[tail--] = cur;
}
};
var nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3;
merge(nums1, m, nums2, n);
console.log(nums1);