数组与字符串之合并两个有序数组
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
说明:
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
提示:
* -10^9 <= nums1[i], nums2[i] <= 10^9
* nums1.length == m + n
* nums2.length == n
示例
输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
分析
双指针从后向前遍历, 假设nums1是合并后的新数组, 遍历nums2, 当nums2中的元素大于nums1中元素的时候, push到nums1后面
代码
Python3
nums1_index = m - 1
nums2_index = n - 1
tail = m + n - 1
while(nums2_index >= 0 and nums1_index >= 0):
if nums1[nums1_index] > nums2[nums2_index]:
nums1[tail] = nums1[nums1_index]
nums1_index -= 1
tail -= 1
else:
nums1[tail] = nums2[nums2_index]
nums2_index -= 1
tail -= 1
JavaScript
function mergeTwoArray(nums1, m, nums2, n) {
let nums1_index = m - 1
let nums2_index = n - 1
let tail = m + n - 1
while (nums2_index >= 0) {
// 当nums1[nums1_index]位置上的数大于nums2[nums2_index]位置上的数时
if (nums1[nums1_index] > nums2[nums2_index]) {
// nums1[tail]上的数为nums1[nums1_index]
nums1[tail] = nums1[nums1_index]
// nums1指针左移
nums1_index--
tail--
} else {
nums1[tail] = nums2[nums2_index]
nums2_index--
tail--
}
}
};
越界问题
在Python3中执行如下数据时会发生越界问题
[2, 0]
1
[1]
1
Python3
if n == 0:
pass
elif m == 0:
nums1[:n] = nums2[:n]
else:
nums1_index = m - 1
nums2_index = n - 1
tail = m + m - 1
while nums1_index >= 0 and nums2_index >= 0:
if nums2[nums2_index] > nums1[nums1_index] :
nums1[tail] = nums2[nums2_index]
nums2_index -= 1
tail -= 1
else:
nums1[tail] = nums1[nums1_index]
nums1_index -= 1
tail -= 1
if nums1_index >= 0:
pass
if nums2_index >= 0:
nums1[tail - nums2_index:tail + 1] = nums2[:nums2_index + 1]