合并有序数组代码在PyCharm与LeetCode运行结果不一致排查
合并有序数组:本地运行与LeetCode提交结果不一致的原因及解决方法
问题核心原因
LeetCode题目明确要求原地修改nums1,但你提交的代码存在关键错误:
nums1 = nums1[0:m] + nums2[0:n]
这行代码并没有修改传入的原nums1数组,而是创建了一个新列表,并让函数内部的局部变量nums1指向这个新对象。LeetCode最终检查的是最初传入的原数组,所以原数组内容还是初始的[1,2,3,0,0,0],自然与预期结果不符。
而本地代码中nums1是全局变量,重新赋值后指向新列表,后续排序操作针对新列表执行,因此能得到正确结果。
正确的原地修改解法
方法1:填充空位后排序(简单直观)
直接将nums2的元素放到nums1的末尾空位,再对原数组排序:
class Solution: def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None: nums1[m:] = nums2 nums1.sort()
方法2:双指针从后往前(时间复杂度O(m+n),更高效)
无需额外空间,从两个数组的有效元素末尾开始比较,将较大的元素放到nums1的最后位置:
class Solution: def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None: i, j, k = m - 1, n - 1, m + n - 1 while i >= 0 and j >= 0: if nums1[i] > nums2[j]: nums1[k] = nums1[i] i -= 1 else: nums1[k] = nums2[j] j -= 1 k -= 1 # 处理nums2剩余的未比较元素 while j >= 0: nums1[k] = nums2[j] j -= 1 k -= 1
内容的提问来源于stack exchange,提问作者D.Zou
相关产品推荐
相关产品推荐

