You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode 2.两数相加:如何避免结果链表末尾生成多余0节点

问题解答

多余尾0节点修复

问题根源是每次计算完当前位的数值后,都无差别提前创建下一个节点,即使已经没有后续位需要计算,所以最后必然会多出来一个冗余的0节点。
最推荐的修复方案是改用链表题通用的哑节点写法,完全避免提前创建多余节点,逻辑更规范也不容易出问题:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def addTwoNumbers(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
        # 哑节点,不存有效值,仅用来挂载结果链表
        total_head = ListNode()
        total = total_head
        carry = 0
        
        while list1 or list2:
            if not list1:
                digit_sum = carry + list2.val
                list2 = list2.next
            elif not list2:
                digit_sum = carry + list1.val
                list1 = list1.next
            else:
                digit_sum = carry + list1.val + list2.val
                list1 = list1.next
                list2 = list2.next
            
            # 计算出当前位结果后再新建节点,不会无意义多建
            total.next = ListNode(digit_sum % 10)
            carry = digit_sum // 10
            total = total.next
            
        # 有进位才新增节点,不需要就不创建
        if carry > 0:
            total.next = ListNode(carry)
        
        # 跳过哑节点返回实际结果头
        return total_head.next

如果不想大幅改动原有代码,也可以在循环结束后做兜底处理:先遍历到结果链表的倒数第二个节点,将它的next设为None即可删掉末尾冗余的0节点,但这种方案如果遇到最后有进位的场景还要额外处理兼容,不如哑节点方案省心。

传入链表指针的疑问解答

完全不需要担心上层作用域的链表被修改。Python的参数传递是对象引用的副本传递,你在函数内修改的是list1、list2这两个局部变量的指向,并没有修改原链表节点本身的结构,也不会修改上层作用域中存储的链表头指针的指向,函数执行结束后上层的两个原始链表还是完整的,头指针也不会变成None。

内容的提问来源于stack exchange,提问作者heretoinfinity

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 17:36:01