思路一: 先merge,在sort。很简单的方法但是没有利用到两个已经是sort好的array这个条件。直接上代码:
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
for(int i = m; i < nums1.length; i++){
nums1[i] = nums2[i - m];
}
Arrays.sort(nums1);
}
}
思路二: two pointer。两个pointer(i,j)分别指向两个数组的m-1下标和n-1下标,我们主要思想是将两个数组从大到小填入数组1。这个比从小到大填入要好,因为不涉及到overwrite数组1数据,如果是从小到大的话我们还需要一个额外的空间来存放数据,不能将数据直接写进数组1,因为有overwirte的问题。回到正题,我们将两个数组的数字从大到小写入数组1。构建一个循环,循环次数是数组2的长度,因为直到把数组2所有数字写完我们的任务也就完成了。每次循环我们比较nums1[i]和nums2[j]的大小,谁大就把谁写进数组1(从尾到头顺序)。相应的也要i–或者j–。下面展示代码:
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int i = m - 1, j = n - 1;
int idx = nums1.length - 1; // idx追踪要写进的nums1的下标
while(j >= 0){
if(i >= 0 && nums1[i] > nums2[j]){
nums1[idx] = nums1[i];
i--;
}else{
nums1[idx] = nums2[j];
j--;
}
idx--;
}
}
}
总结:无