給你兩個有序整數數組 nums1 和 nums2,請你將 nums2 合併到 nums1 中,使 nums1 成爲一個有序數組。
說明:
初始化 nums1 和 nums2 的元素數量分別爲 m 和 n 。
你可以假設 nums1 有足夠的空間(空間大小大於或等於 m + n)來保存 nums2 中的元素。
示例:
輸入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
輸出: [1,2,2,3,5,6]
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/merge-sorted-array
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
//方法一:暴力法
//數組拷貝+排序
// mergeI(nums1, m, nums2, n);
//方法二:雙指針法/從後向前
//1.定義指針len1指向nums1的數字尾部,len2指向nums2的數字尾部,len指向nums1的最末端
//2.從後向前遍歷,比較nums1和nums2值大小,將較大者放入nums1數組尾部
//3.當 len1<0 時遍歷結束,如果nums2數組元素未拷貝結束,則將nums2中剩下元素直接放到nums1的前面即可
// mergeII(nums1, m, nums2, n);
//方法三:雙指針/從前往後
//1.定義雙指針p1指向nums1頭部,p2指向nums2頭部,比較p1和p2值大小,將較小者放入數組nums1中
//定義數組temp將nums1中的前m元素放到temp中
mergeIII(nums1, m, nums2, n);
}
private void mergeIII(int[] nums1, int m, int[] nums2, int n) {
int[] temp = new int[m];
System.arraycopy(nums1, 0, temp, 0, m);
int p1 = 0, p2 = 0, p = 0;
//比較p1和p2值,將較小者放到數組nums1
while (p1 < m && p2 < n) {
nums1[p++] = temp[p1] < nums2[p2] ? temp[p1++] : nums2[p2++];
}
//將nums1和nums2剩餘元素放到nums1中
while (p1 < m) {
nums1[p++] = temp[p1++];
}
while (p2 < n) {
nums1[p++] = nums2[p2++];
}
}
private void mergeII(int[] nums1, int m, int[] nums2, int n) {
int len1 = m - 1, len2 = n - 1, len = m + n - 1;
while (len1 >= 0 && len2 >= 0) {
nums1[len--] = nums1[len1] > nums2[len2] ? nums1[len1--] : nums2[len2--];
}
//拷貝nums2剩餘元素
while (len2 >= 0) {
nums1[len--] = nums2[len2--];
}
}
private void mergeI(int[] nums1, int m, int[] nums2, int n) {
System.arraycopy(nums2, 0, nums1, m, n);
Arrays.sort(nums1);
}
}