88. 合并两个有序数组
题目描述
方法一:合并后排序
- 先将
nums2
并入nums1
中,再对nums1
进行排序。(这里用的是选择排序法)
var nums1Length=m+n,temp,minIndex;
// 合并
if(nums2.length==0)
return nums1;
while(m<nums1Length){
nums1[m]=nums2[n-1];
m++;
n--;
}
// 排序
for(let i=0;i<nums1Length-1;i++){
var minIndex=i;
for(let j =i+1;j<nums1Length;j++){
if(nums1[j]<nums1[minIndex])
minIndex=j;
}
if(i!=minIndex){
temp=nums1[i];
nums1[i]=nums1[minIndex];
nums1[minIndex]=temp;
}
}
return nums1;
};
复杂度分析:
- 时间复杂度: O ( n 2 ) O(n^2) O(n2) 。
- 空间复杂度: O ( 1 ) O(1) O(1)。
方法二:双指针
从后往前遍历,把大的数放到数组nums1的后面:
- 因为
nums1
和nums2
都是升序的,所以我们设置两个指针len1=m-1
指向nums1
最后一个数字、len2=n-1
指向nums2
最后一个数字,len=nums.length-1
指向nums1
的最后一个位置; - 从后向前比较
nums1[len1]
和nums2[len2]
; - 若
nums1[len1]
>nums2[len2]
,那么nums1[len]=nums1[len1]
;len1--
;len--
; 反之nums1[len]=nums2[len2]
;len2--
;len--
;直到len1
或len2
小于0; - 若
len1
小于0,则直接返回nums1
,若len2
小于0,则将len2
中剩余的数填入nums1
中,最后返回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 merge = function(nums1, m, nums2, n) {
var len=nums1.length-1,len1=m-1,len2=n-1;
while(len1>=0&&len2>=0){
if(nums1[len1]>nums2[len2]){
nums1[len]=nums1[len1];
len1--;
}
else {
nums1[len]=nums2[len2];
len2--;
}
len--;
}
if(len1<0){
while(len2>=0){
nums1[len]=nums2[len2];
len2--;
len--;
}
return nums1;
}
else{
return nums1;
}
};
复杂度分析:
- 时间复杂度: O ( m + n ) O(m+n) O(m+n) 。
- 空间复杂度: O ( 1 ) O(1) O(1)。