给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。
示例1:
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
示例2:
输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
题目包含的信息与要求如下:
我们分别设置以下标签:
l_m指向nums1已初始化的元素(m个)。
l_n指向nums2已初始化的元素(n个)。
l_1指向nums1所有元素(m+n个)。
当l_m、l_n均大于0时,”以从后向前的顺序遍历对比nums1与nums2的已初始化元素,哪个大就放l-1对应的位置上(从后向前的顺序放置),每次对比放置完成后,对应标签数字“-1”,直至l_m或l_n其中一个“不大于等于零”。
如果l_m不大于等于零, l_n大于等于零,则继续遍历对比,直至l_n不大于等于零。
如果l_m大于等于零, l_n不大于等于零,则不需遍历对比,因为是对nums1进行修改,数组本身就是排好序的。
from typing import List
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
l_m,l_n,l_1 = m-1,n-1,len(nums1)-1
while l_m >= 0 and l_n >= 0:
if nums1[l_m] >= nums2[l_n]:
nums1[l_1] = nums1[l_m]
l_m -= 1
else:
nums1[l_1] = nums2[l_n]
l_n -=1
l_1 -=1
while l_n >= 0:
nums1[l_1] = nums2[l_n]
l_n -= 1
l_1 -= 1
print(nums1)
if __name__ == "__main__":
solution = Solution()
solution.merge(nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3)
时间复杂度: O(m+n)
指针移动单调递减,最多移动 m+n次。
空间复杂度:O(1)
直接对数组nums1原地修改,不需要额外空间。
1、“问题”与“提示”转载于:
力扣(LeetCode)
https://leetcode-cn.com/problems/merge-sorted-array
2、代码参考:
JonnyHuang
https://leetcode-cn.com/problems/merge-sorted-array/solution/python3-shuang-zhi-zhen-xiu-gai-0mnfu-za-dee5/