题目链接:https://leetcode-cn.com/problems/merge-sorted-array/
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
// 思路:
// 双指针的方式。 【充分利用本身有序的特点】
// 首先 copy 一份 nums1 出来 [因为最后返回的要是nums1]
// 用两个指针,一个从 nums1_copy[0] 开始,一个从nums2[0]开始往后
// 对比哪个跟小,就先放进 nums1
// 剩余的直接放到nums1 后面即可
int[] nums1_copy = new int[m];
System.arraycopy(nums1, 0, nums1_copy, 0, m);
// nums1_copy 的指针
int p_copy = 0;
// nums1 的指针
int p1 = 0;
// nums2 的指针
int p2 = 0;
while(p_copy < m && p2 < n){
nums1[p1++] = nums1_copy[p_copy] < nums2[p2]? nums1_copy[p_copy++]:nums2[p2++];
}
// 如果 nums2已经全部放到了nums1上,接下来就要把 nums_copy剩余的放到nums1上面去
if(p_copy < m){
System.arraycopy(nums1_copy, p_copy, nums1, p_copy+p2, m + n - p_copy - p2);
}
// 如果 nums_copy 已经全部放到了nums1上,接下来就要把 nums2 剩余的放到nums1上面去
if(p2 < n){
System.arraycopy(nums2, p2, nums1, p_copy+p2, m + n - p_copy - p2);
}
}
}
难点:
1 双指针思维
2 System.arraycopy();方法的使用,因为面试的时候一般情况下没有自动提示,需要手写,需要表熟悉库函数的拼写和参数含义
* @param src the source array. 源数组
* @param srcPos starting position in the source array. 源数组中的起始位置
* @param dest the destination array.目标数组
* @param destPos starting position in the destination data.目标数组中的起始位置
* @param length the number of array elements to be copied.要复制的数组元素的数量
简单来说就源数组 src 的第几个 srcPos 开始,复制到目标数组 dest 的第几个 destPos 上面去,一共复制源数组的 length 个
* @exception IndexOutOfBoundsException if copying would cause
* access of data outside array bounds.
* @exception ArrayStoreException if an element in the <code>src</code>
* array could not be stored into the <code>dest</code> array
* because of a type mismatch.
* @exception NullPointerException if either <code>src</code> or
* <code>dest</code> is <code>null</code>.
*/
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);