这个题目可是折腾死我了。本身是一道简单难度的题目,但是就是思考错了方向,导致很长时间没做出来。
我最开始的思路是使用两个指针,递增,两个数组的值比较,遇到合适的位置就insert进第一个数组。
但是这样的办法一是弄复杂了问题,二是要申请额外的空间,而且列表的插入的复杂度是on。很不好
后来看了评论区。原来更好的办法是倒着插入。用三个指针。
1. 根据m,n求得合并之后数组的长度,记作p,p的意义是指向合并数组的最后一个元素然后往前走(递减)
2. 比较第一个数组的末尾和第二个数组的末尾的大小。谁大把谁放在p的位置,同时p和大的数组的指针减小1。
3.以上使用while循环,只要指向数组的两个指针还是大于等于0的
4.如果n还是大于等于0,则说明,第二个数组没有比较完,就退出循环了(第一个数组的指针已经遍历完了),则说明第二个数组中n之前的元素都小于p指向的元素,则把那些更小的元素都赋值到p的前面。
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."""p = m+n-1m = m-1n = n-1while m >= 0 and n >= 0:if nums1[m] > nums2[n]:nums1[p] = nums1[m]m -= 1else:nums1[p] = nums2[n]n -= 1p -= 1while n >=0:nums1[p] = nums2[n]p -= 1n -= 1