题目要求
给你两个有序整数数组 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]
提示:
-10^9 <= nums1[i], nums2[i] <= 10^9
nums1.length == m + n
nums2.length == n
思路
纯copy
因为 nums1 的空间都集中在后面,所以从后向前处理排序的数据会更好,节省空间,一边遍历一边将值填充进去
设置指针 len1 和 len2 分别指向 nums1 和 nums2 的有数字尾部,从尾部值开始比较遍历,同时设置指针 len 指向 nums1 的最末尾,每次遍历比较值大小之后,则进行填充
当 len1<0 时遍历结束,此时 nums2 中海油数据未拷贝完全,将其直接拷贝到 nums1 的前面,最后得到结果数组
时间复杂度:O(m+n)O(m+n)
解法
public void merge(int[] nums1, int m, int[] nums2, int n) {
// nums1和nums2的指针
int p1 = m - 1;
int p2 = n - 1;
// 设置nums1的指针
int p = m + n - 1;
while ((p1 >= 0) && (p2 >= 0))
//从后往前遍历,比较两个数组的元素,nums2大于nums1的话,将赋给num1,反之
nums1[p--] = (nums1[p1] < nums2[p2]) ? nums2[p2--] : nums1[p1--];
// 从nums2中添加缺少的元素
System.arraycopy(nums2, 0, nums1, 0, p2 + 1);
// Make a copy of nums1.
/* int [] nums3 = new int[m];
System.arraycopy(nums1, 0, nums3, 0, m);
// Two get pointers for nums3 and nums2.
int p3 = 0;
int p2 = 0;
// Set pointer for nums1
int p1 = 0;
// Compare elements from nums3 and nums2
// and add the smallest one into nums1.
while ((p3 < m) && (p2 < n))
nums1[p1++] = (nums3[p3] < nums2[p2]) ? nums3[p3++] : nums2[p2++];
// if there are still elements to add
if (p3 < m)
System.arraycopy(nums3, p3, nums1, p3 + p2, m + n - p3 - p2);
if (p2 < n)
System.arraycopy(nums2, p2, nums1, p3 + p2, m + n - p3 - p2);*/
}