一. 题目
- 题目
- 示例
二. 方法一
-
解题思路
- 为每个列表定义一个指针l1, l2, 用于后续元素的比较
- 如果 l1指向的元素小于l2指向的元素, 则l1向后移动一位
- 如果 l1指向的元素大于等于l2指向的元素, 则将l2指向的元素插入到l1所指的位置
- 将l2向后移动一位, nums1中元素个数(m) + 1; 并且弹出num1中最后一个元素, 如果不弹出, list1的长度将改变
- 当l1的指向了nums1的最后一个元素时, 此时nums2中剩下的元素都比num1中的元素大
- 只需要将num2剩余的元素依次插入到nums1元素的后面即可.
- 此时仍然需要执行操作4
- 遍历完后就OK了
-
解题代码
def merge( nums1: List[int], m: int, nums2: List[int], n: int): # 为每个列表定义一个指针l1, l2, 用于后续元素的比较 l1, l2 = 0, 0 while l2 < n: # 如果 l1指向的元素小于l2指向的元素, 则l1向后移动一位 while nums1[l1] < nums2[l2] and l1 < m: l1 += 1 # 如果l1指向的元素大于等于l2指向的元素, 则将l2指向的元素插入到l1所指的位置 # 如果l1的指向了nums1的最后一个元素时, 则将l2剩余的元素插入到l1所指的位置 if nums1[l1] >= nums2[l2] or nums1[m - 1] <= nums2[l2]: nums1.insert(l1, nums2[l2]) # nums2的指针向后移动 l2 += 1 # 修改nums元素个数 m += 1 # 添加一个元素, 就弹出一个元素, 确保nums1的长度不变 # 因为没有返回值, 所以只能通过这样控制 nums1.pop()
-
分析
时间复杂度: O(n)
空间复杂度: O(1)