给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
说明:
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m +n)来保存 nums2 中的元素。
示例:输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3输出:[1,2,2,3,5,6]
方法一:先合并两个数组,然后排序。这种方法的时间复杂度较高,O((n+m)log(n+m))
方法二:双指针从前往后遍历,一般而言,对于有序数组可以通过双指针法达到O(n+m)的时间复杂度。
最直接的算法实现是将指针p1 置为 nums1的开头, p2为 nums2的开头,在每一步将最小值放入输出数组中。由于 nums1 是用于输出的数组,需要将nums1中的前m个元素放在其他地方,也就需要 O(m)的空间复杂度。
方法三:三指针尾部遍历
将指针p1 置为 nums1的有效元素的结尾,即m-1处, p2为 nums2的结尾,即n-1处。p指针为合并后当前元素在nums1中插入的位置。
其中一个数组先排序完的情况:如果是nums2先遍历完,那么nums1中剩余的项已经有序且在输出数组中;如果是nums1先遍历完,那么nums2剩下的项只需按顺序放入nums1中即可。
var merge = function(nums1, m, nums2, n) {
let p1 = m-1,p2 = n-1,p = m+n-1;
while(p1 >= 0 && p2 >= 0){
if(nums1[p1] >= nums2[p2]){
nums1[p--] = nums1[p1--];
}else{
nums1[p--] = nums2[p2--];
}
}
while(p2 >= 0) nums1[p--] = nums2[p2--];
};
时间复杂度O(n+m),空间复杂度O(1)。
可以和合并两个有序链表对比