88. 合并两个有序数组
1.新开一个数组保存
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int [] sort=new int [m+n];
int p1=0;
int p2=0;
int current=0;
while( p1 < m || p2 < n){
if(p1 == m){
sort[current++]=nums2[p2++];
}else if(p2 == n){
sort[current++]=nums1[p1++];
}else if(nums1[p1] <= nums2[p2]){
sort[current++]=nums1[p1++];
}else{
sort[current++]=nums2[p2++];
}
}
for(int j=0;j<m+n;j++){
nums1[j]=sort[j];
}
}
}
因为时新开了一个数组来保存,所以空间复杂度是O(n+m);
var merge = function(nums1, m, nums2, n) {
let sort=new Array(m+n);
let p1=0;
let p2=0;
let current=0;
while(p1<m || p2<n){
//nums1数组已经比较完了
if(p1===m){
sort[current++]=nums2[p2++];
}else if(p2 === n){
sort[current++]=nums1[p1++];
}else if(nums1[p1]<=nums2[p2]){
sort[current++]=nums1[p1++];
}else{
sort[current++]=nums2[p2++];
}
}
for(let j=0;j<m+n;j++){
nums1[j]=sort[j];
}
};
2.逆向双指针
后面的位置永远足够容纳被插入的元素,不会产生 p1 的元素被覆盖的情况。
var merge = function(nums1, m, nums2, n) {
let p1=m-1;
let p2=n-1;
//更换元素的那个指针
let tail=n+m-1;
let cur=0;
//这里注意下边界条件
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;
}
};