这道题我总共想了三种解法。
1.将nums2中的元素依次放入nums1有效元素的后面,再总体进行排序。
import java.util.*;
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int j = 0;
for(int i = m;i<m+n;i++){
nums1[i] = nums2[j];
j++;
}
Arrays.sort(nums1);
}
}
运行结果
Arrays.sort() 这种java自带的排序的背后是快速排序。所以时间复杂度是O(nlogn)。由于没有用额外的空间,所以空间复杂度是O(1)。
2.复制一个和nums1一模一样的数组tmp,再让复制后的数组tmp和nums2依次比较插入到nums1数组中。
这样时间复杂度就是O(m+n)。
import java.util.*;
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int[] tmp = Arrays.copyOf(nums1,nums1.length);
int p1 = 0; //指向tmp数组的指针
int p2 = 0; //指向nums2数组的指针
int i = 0; //指向nums1数组的指针
while(p1<m && p2<n){
if(tmp[p1] <= nums2[p2]) {
nums1[i] = tmp[p1];
p1++;
}else{
nums1[i] = nums2[p2];
p2++;
}
i++;
} //从while循环出来,说明肯定有一个数组已经全部插入了,就不用再比较了。
//将还未插完的数组依次直接插入即可。
if(p1<m){
for(;p1<m;p1++){
nums1[i] = tmp[p1];
i++;
}
}
if(p2<n){
for(;p2<n;p2++){
nums1[i] = nums2[p2];
i++;
}
}
}
}
运行结果
3.双指针尾插法
从两个数组的末尾开始比较,类似于直接插入排序。
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int tmp = 0;
for(int i =0;i<n;i++) {
tmp = m-1+i;
while(tmp>-1 && nums2[i] < nums1[tmp]) {
nums1[tmp+1] = nums1[tmp];
tmp--;
}
nums1[tmp+1] = nums2[i];
}
}
}
运行结果