题目链接

// 如果想降序怎么办呢?使用:Arrays.sort(scores,Collections.reverseOrder());class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { // merge1(nums1,m,nums2,n); // merge2(nums1,m,nums2,n); // merge3(nums1,m,nums2,n); merge4(nums1,m,nums2,n); } // 1.api public void merge1(int[] nums1, int m, int[] nums2, int n) { System.arraycopy(nums2, 0, nums1, m, n); Arrays.sort(nums1); } // 2.双指针 public void merge2(int[] nums1, int m, int[] nums2, int n) { int[] nums1_copy = new int[m]; System.arraycopy(nums1, 0, nums1_copy, 0, m); int p1 = 0; int p2 = 0; int p = 0; while(p1 < m && p2 < n) { nums1[p++] = nums1_copy[p1] < nums2[p2] ? nums1_copy[p1++] : nums2[p2++]; } // 存在某一个为空 if(p1 < m) { while(p1 < m) { nums1[p++] = nums1_copy[p1++]; } } else { while(p2 < n) { nums1[p++] = nums2[p2++]; } } } // 3.尾指针.我的尾指针 public void merge3(int[] nums1, int m, int[] nums2, int n) { int p = m+n; while(n > 0 && m > 0) { if(nums1[m-1] > nums2[n-1]) { nums1[p-1] = nums1[m-1]; p--; m--; } else { nums1[p-1] = nums2[n-1]; p--;n--; } } while(n > 0) { nums1[p-1] = nums2[n-1]; p--; n--; } } // 4.老师的尾指针 public void merge4(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--] = nums1[p1] < nums2[p2] ? nums2[p2--] : nums1[p1--]; } System.arraycopy(nums2, 0, nums1, 0, p2+1); // 因为p2就是下标所以需要进行+1 }}