题目描述
给定两个有序整数数组 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]
解法1
混合插入有序数组,由于两个数组都是有序的,所有只要按顺序比较大小即可。题目中说了nums1数组有足够大的空间,说明我们不用resize数组,又给了我们m和n,那就知道了混合之后的数组的大小。
- 从nums1和nums2数组的末尾开始一个一个比较,
- 把较大的数,按顺序从后往前加入混合之后的数组末尾。
- 需要三个变量
i,j,k
,分别指向nums1,nums2,和混合数组的末尾。 - 进行while循环,如果
i
和j
都大于0,- 如果n
ums1[i] > nums2[j]
,说明要先把nums1[i]加入混合数组的末尾
,加入后k
和i
都要自减1; - 反之就把nums2[j]加入混合数组的末尾,加入后
k
和j
都要自减1。
- 如果n
- 循环结束后,有可能i或者j还大于等于0,若j大于0,那么我们还需要继续循环,将nums2中的数字继续拷入nums1。若是i大于等于0,那么就不用管,因为混合数组本身就放在nums1中,参见代码如下:
class Solution(object):
def merge(self, nums1, m, nums2, n):
"""
:type nums1: List[int]
:type m: int
:type nums2: List[int]
:type n: int
:rtype: None Do not return anything, modify nums1 in-place instead.
"""
i, j = m-1, n-1
k = - 1
while i >= 0 and j >= 0:
# 取出较大的值放到nums1的末尾
if nums1[i] > nums2[j]:
nums1[k] = nums1[i]
i -= 1
k -= 1
else:
nums1[k] = nums2[j]
j -= 1
k -= 1
# 如果nums2有剩余,直接加到nums1上
while j >= 0:
nums1[k] = nums2[j]
j -= 1
k -= 1