题目链接
// 如果想降序怎么办呢?使用: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
}
}