1.直接合并,利用Arrays.sort()进行排序
没有充分利用数组的有序性
public void merge(int []nums1,int m,int []nums2,int n){
for(int i=0;i<n;i++){
nums1[m+i] = nums2[i];
}
Arrays.sort(nums1);
}
2.利用临时数组
时间复杂度O(m+n),空间复杂度O(m+n)
public void merge2(int []nums1,int m,int []nums2,int n){
int k = m+n;
int[] temp = new int[k];
for(int index = 0,nums1Index = 0,nums2Index =0;index<k;index++){
if(nums1Index>=m){
temp[index] = nums2[nums2Index++];
}else if(nums2Index>=n){
temp[index] = nums1[nums1Index++];
}else if(nums1[nums1Index] < nums2[nums2Index]){
temp[index] = nums1[nums1Index++];
}else{
temp[index] = nums1[nums2Index++];
}
}
for(int i=0;i<k;i++){
nums1[i]=temp[i];
}
}
3.倒序
时间复杂度O(n+m),空间复杂度O(1)
public void merge3(int []nums1,int m,int []nums2,int n){
int k= m+n;
for(int index = k-1,nums1Index = m-1,nums2Index =n-1;index>=0;index--){
if(nums1Index < 0){ //nums1已经取完,完全取nums2的值即可
nums1[index] = nums2[nums2Index--];
}else if(nums2Index < 0){ // nums2已经取完,完全取nums1的值即可
break;
}else if(nums1[nums1Index] >nums2[nums2Index]){ //nums1的元素大于nums2,取nums1的值
nums1[index] = nums1[nums1Index--];
}else{ //nums2的值大于等于nums1,取nums2的值
nums1[index] = nums2[nums2Index--];
}
}
}