LeetCode两数相加问题:ListNode无__getitem__属性错误排查
错误原因分析
你本地测试时传入的是列表,列表支持[::-1]切片和索引访问,但LeetCode实际传入的是ListNode节点对象——这种对象没有列表的索引/切片能力,所以执行l1[::-1]会触发TypeError: 'ListNode' object has no attribute '__getitem__'。此外,你的代码最后返回的是列表,但题目要求返回ListNode类型,这也不符合题目的输出要求。
解决方法
必须按照链表的操作逻辑来实现:遍历两个链表逐位相加、处理进位,最后构建出符合要求的ListNode结果链表。
首先明确LeetCode中ListNode的结构
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 # 哑节点的下一个节点才是结果链表的头
本地测试辅助代码
如果要在本地用列表测试,需要先把列表转换成ListNode对象,测试后再转回列表查看结果:
def list_to_linkedlist(lst): dummy = ListNode(0) current = dummy for num in lst: current.next = ListNode(num) current = current.next return dummy.next def linkedlist_to_list(node): lst = [] while node: lst.append(node.val) node = node.next return lst # 测试示例 l1 = list_to_linkedlist([2, 4, 3]) l2 = list_to_linkedlist([5, 6, 4]) result = Solution().addTwoNumbers(l1, l2) print(linkedlist_to_list(result)) # 输出 [7, 0, 8],对应342+465=807的逆序
内容的提问来源于stack exchange,提问作者Ross Geller
相关产品推荐
相关产品推荐

