leetcode88. 合并两个有序数组

法一:第一时间想到的额外空间
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int i = 0,j = 0;
int[] res = new int[m + n];
while(i < m && j < n){
if(nums1[i] <= nums2[j]){
res[i + j] = nums1[i]; ++i;
continue;
}
else{
res[i + j] = nums2[j]; ++j;
continue;
}
}
while(i < m){
res[i + j] = nums1[i]; ++i;
}
while(j < n){
res[i + j] = nums2[j]; ++j;
}
for(int k = 0;k < m + n;++k) nums1[k] = res[k];
}
}
法二:直接合并排序
class Solution {
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);
}
}
法三:倒序双指针。性能最好,不需要额外数组
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int p1 = m - 1;
int p2 = n - 1;
int p = m + n - 1;
while (p2 >= 0) { // nums2 还有要合并的元素
// 如果 p1 < 0,那么走 else 分支,把 nums2 合并到 nums1 中
if (p1 >= 0 && nums1[p1] > nums2[p2]) {
nums1[p--] = nums1[p1--]; // 填入 nums1[p1]
} else {// if(p1 < 0 || nums1[p1] <= nums2[p2])
nums1[p--] = nums2[p2--]; // 填入 nums2[p1]
}
}
}
}


浙公网安备 33010602011771号