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
相关产品推荐
相关产品推荐

