给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
说明:
- 初始化 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]
/*
解题思路,选择由后往前填充,因为nums1末尾有足够多余的空间,而且如果由前往后,需要记住某些被移动元素的大小。
由后往前就是先将两个数组当前最大的值填入nums1数组末尾。
1、如果某个数组提前被遍历完了,剩下的数组内容直接填入nums1既可以。
而且1这个情况,我们只需要考虑nums1元素都遍历完成后,无需变动位置时候,只处理nums2的元素
因为,nums1本身就我们想要的数组结果
*/
public static void merge(int[] nums1, int m, int[] nums2, int n) {
int nums1LastIndex = m - 1;
int nums2LastIndex = n - 1;
int resultLastIndex = m + n - 1;
while (nums1LastIndex >= 0 && nums2LastIndex >= 0) {
nums1[resultLastIndex--] =
nums1[nums1LastIndex] > nums2[nums2LastIndex] ? nums1[nums1LastIndex--] : nums2[nums2LastIndex--];
}
while (nums2LastIndex >= 0) {
nums1[resultLastIndex--] = nums2[nums2LastIndex--];
}
}