题目
题解
代码
import java.util.*;
public class code88 {
// public static void merge(int[] nums1, int m, int[] nums2, int n) {
// System.arraycopy(nums2, 0, nums1, m, n);
// Arrays.sort(nums1);
// }
// public static void merge(int[] nums1, int m, int[] nums2, int n) {
// for (int i = m, j = 0; (i < m + n) && (j < n); i++, j++) {
// nums1[i] = nums2[j];
// }
// Arrays.sort(nums1);
// }
// public static void merge(int[] nums1, int m, int[] nums2, int n) {
// int len1 = m - 1;
// int len2 = n - 1;
// int len = m + n - 1;
// while (len1 >= 0 && len2 >= 0) {
// if (nums1[len1] > nums2[len2]) {
// nums1[len] = nums1[len1];
// len1--;
// len--;
// } else if (nums1[len1] <= nums2[len2]) {
// nums1[len] = nums2[len2];
// len2--;
// len--;
// }
// }
// System.arraycopy(nums2, 0, nums1, 0, len2 + 1);
// }
public static void merge(int[] nums1, int m, int[] nums2, int n) {
//先归并大的,这样一遍扫描即可。
for (int k = m + n - 1, i = m - 1, j = n - 1; k >= 0; k--) {
if (i < 0) {
nums1[k] = nums2[j];
j--;
continue;
}
if (j < 0) {
nums1[k] = nums1[i];
i--;
continue;
}
// 当 if(j < 0) 的时候,就可以直接跳出循环了,因为后面的值都是它自身的
// if(j < 0)
// {
// break;
// }
if (nums1[i] >= nums2[j]) {
nums1[k] = nums1[i];
i--;
} else if (nums1[i] < nums2[j]) {
nums1[k] = nums2[j];
j--;
}
}
}
public static void main(String[] args) {
int nums1[] = { 1, 2, 3, 0, 0, 0 };
int m = 3;
int nums2[] = { 2, 5, 6 };
int n = 3;
merge(nums1, m, nums2, n);
System.out.println(Arrays.toString(nums1));
}
}