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

LeetCode两数相加代码报错NameError: global name 'linked' is not defined

问题分析与修复方案

错误原因

你碰到的NameError: global name 'linked' is not defined是因为**linked变量从未被定义,也没有实例化为ListNode对象**。Python里不能直接通过linked.val这种方式创建新节点,必须先调用ListNode()构造函数生成实例。

代码里的其他致命问题

除了未定义linked,你的代码还有几个严重逻辑错误:

  • 硬编码链表长度为3:直接访问l1.next、l1.next.next,但题目中两个链表的长度可能是任意的(不一定是3个节点),遇到更短或更长的链表会直接报错。
  • 完全没处理进位:两数相加时,若某一位的和超过10,需要向高位进位,你的代码完全忽略了这个核心逻辑。
  • 重复赋值覆盖:最后两行都给linked.next.val赋值,后面的值会直接覆盖前面的,逻辑完全错误。

正确实现代码

按照题目要求,正确的做法是遍历两个链表,逐位相加并处理进位,同时构建结果链表:

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        dummy = ListNode(0)  # 哑节点,简化头节点处理
        current = dummy
        carry = 0  # 记录进位
        
        # 循环条件:只要还有未处理的节点或进位,就继续
        while l1 or l2 or carry:
            # 取当前节点的值,空节点取0
            val1 = l1.val if l1 else 0
            val2 = l2.val if l2 else 0
            
            # 计算当前位总和与进位
            total = val1 + val2 + carry
            carry = total // 10  # 进位值
            current_val = total % 10  # 当前位的值
            
            # 创建新节点并移动指针
            current.next = ListNode(current_val)
            current = current.next
            
            # 移动原链表指针
            if l1:
                l1 = l1.next
            if l2:
                l2 = l2.next
        
        return dummy.next

代码关键点说明

  • 哑节点dummy:避免单独处理结果链表头节点为空的特殊情况,最后返回dummy.next就是真正的头节点。
  • 循环条件包含carry:确保最后一位相加产生的进位也被处理(比如999+1=1000的情况)。
  • 兼容不同长度链表:空节点取值为0,不管两个链表长度是否一致都能正确计算。
  • 逐位构建结果:每次计算后创建新节点,逐步拼接成结果链表。

内容的提问来源于stack exchange,提问作者Lúcio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 02:45:24