题目链接
    image.png

    1. // 如果想降序怎么办呢?使用:Arrays.sort(scores,Collections.reverseOrder());
    2. class Solution {
    3. public void merge(int[] nums1, int m, int[] nums2, int n) {
    4. // merge1(nums1,m,nums2,n);
    5. // merge2(nums1,m,nums2,n);
    6. // merge3(nums1,m,nums2,n);
    7. merge4(nums1,m,nums2,n);
    8. }
    9. // 1.api
    10. public void merge1(int[] nums1, int m, int[] nums2, int n) {
    11. System.arraycopy(nums2, 0, nums1, m, n);
    12. Arrays.sort(nums1);
    13. }
    14. // 2.双指针
    15. public void merge2(int[] nums1, int m, int[] nums2, int n) {
    16. int[] nums1_copy = new int[m];
    17. System.arraycopy(nums1, 0, nums1_copy, 0, m);
    18. int p1 = 0;
    19. int p2 = 0;
    20. int p = 0;
    21. while(p1 < m && p2 < n) {
    22. nums1[p++] = nums1_copy[p1] < nums2[p2] ? nums1_copy[p1++] : nums2[p2++];
    23. }
    24. // 存在某一个为空
    25. if(p1 < m) {
    26. while(p1 < m) {
    27. nums1[p++] = nums1_copy[p1++];
    28. }
    29. } else {
    30. while(p2 < n) {
    31. nums1[p++] = nums2[p2++];
    32. }
    33. }
    34. }
    35. // 3.尾指针.我的尾指针
    36. public void merge3(int[] nums1, int m, int[] nums2, int n) {
    37. int p = m+n;
    38. while(n > 0 && m > 0) {
    39. if(nums1[m-1] > nums2[n-1]) {
    40. nums1[p-1] = nums1[m-1];
    41. p--;
    42. m--;
    43. } else {
    44. nums1[p-1] = nums2[n-1];
    45. p--;n--;
    46. }
    47. }
    48. while(n > 0) {
    49. nums1[p-1] = nums2[n-1];
    50. p--;
    51. n--;
    52. }
    53. }
    54. // 4.老师的尾指针
    55. public void merge4(int[] nums1, int m, int[] nums2, int n) {
    56. int p1 = m-1;
    57. int p2 = n-1;
    58. int p = m+n-1;
    59. while(p1 >= 0 && p2 >= 0) {
    60. nums1[p--] = nums1[p1] < nums2[p2] ? nums2[p2--] : nums1[p1--];
    61. }
    62. System.arraycopy(nums2, 0, nums1, 0, p2+1); // 因为p2就是下标所以需要进行+1
    63. }
    64. }