Python中为何merge函数末尾未使用nums1的更新值?
问题解决:原地修改nums1失效的原因及修正
你的问题核心是函数内部重新赋值nums1,导致脱离了原列表的引用,后续操作全在新列表上执行,原列表根本没被改动。
错误根源
看你的代码:
else: nums1 = nums1[:m] # 这里创建了一个新的切片列表,函数内的nums1变量现在指向这个新对象 nums1.extend(nums2)
Python里列表是引用传递,但你这里直接给nums1赋值了新的列表对象,相当于把函数内部的nums1和外部传入的原nums1彻底断开了联系。后面的sort()只是给这个新列表排序,原列表完全没变化,所以函数结束后外部的nums1还是初始值。
修正方案
要原地修改,绝对不能给nums1重新赋值新列表,直接在原列表上修改元素即可。题目里nums1的长度本来就是m+n(题目设定的前提),所以直接替换原列表的后半部分,再排序就行:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None: """ Do not return anything, modify nums1 in-place instead. """ # 直接把nums1从索引m开始的部分替换成nums2,这是原地修改原列表 nums1[m:] = nums2 # 对原列表排序 nums1.sort()
额外说明
- 这个写法自动覆盖了m=0的情况:当m=0时,
nums1[0:] = nums2会把整个nums1替换成nums2,符合要求。 - 如果你想实现更高效的双指针合并(不用sort),也可以,但先解决原地修改的核心问题再说。
内容的提问来源于stack exchange,提问作者FevtheDev
相关产品推荐
相关产品推荐

