这道题我总共想了三种解法。
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];}}}
运行结果