题目描述
排序
最直观的想法,先复制在排序,没有体现算法思想。
public void merge(int[] nums1, int m, int[] nums2, int n) {
/*
* 排序
*/
System.arraycopy(nums2, 0, nums1, m, n);
Arrays.sort(nums1);
}
双指针
public void merge(int[] nums1, int m, int[] nums2, int n) {
/*
* 双指针
*/
int[] nums1Copy = new int[nums1.length];
System.arraycopy(nums1, 0, nums1Copy, 0, m);
int p1 = 0;
int p2 = 0;
for (int i = 0; i < nums1.length - 1 && p2 < n && p1 < m; i++) {
nums1[i] = nums1Copy[p1] > nums2[p2] ? nums2[p2++] : nums1Copy[p1++];
}
if (p1 < m) {
System.arraycopy(nums1Copy, p1, nums1, p1 + p2, nums1.length - p1 - p2);
}
if (p2 < n) {
System.arraycopy(nums2, p2, nums1, p1 + p2, nums1.length - p1 - p2);
}
System.out.println(Arrays.toString(nums1));
逆向双指针
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 (p1 >= 0 && p2 >= 0) {
nums1[p--] = nums2[p2] > nums1[p1] ? nums2[p2--] : nums1[p1--];
}
System.arraycopy(nums2, 0, nums1, 0, p2 + 1);
System.out.println(Arrays.toString(nums1));
}