LeetCode合并两有序链表报错:'list'对象无val属性
报错原因
运行时抛出的错误为:
AttributeError: 'list' object has no attribute 'val'
触发原因是入参类型不匹配:mergeTwoLists 方法要求传入的参数是ListNode类型的链表头节点,但本地测试时直接传入了Python原生list类型的[1,2,3]。原生列表不存在val、next这类链表节点属性,执行到取值逻辑时就会抛出属性错误。
LeetCode提交代码时平台会自动把数组格式的用例转换成对应链表结构传入,所以核心合并逻辑本身没有问题,报错只出在本地测试的参数构造环节。
修复方案
本地测试前需要先把原生列表转换成ListNode组成的链表结构,同时补全缺失的类型导入即可。
完整可运行代码如下:
from typing import Optional class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next class Solution: def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]: cur = dummy = ListNode() while list1 and list2: if list1.val < list2.val: cur.next = list1 list1, cur = list1.next, list1 else: cur.next = list2 list2, cur = list2.next, list2 if list1 or list2: cur.next = list1 if list1 else list2 return dummy.next # 数组转链表工具函数,用于构造测试入参 def arr_to_linkedlist(arr): dummy = ListNode() cur = dummy for num in arr: cur.next = ListNode(num) cur = cur.next return dummy.next # 链表转数组工具函数,用于打印输出结果 def linkedlist_to_arr(head): res = [] while head: res.append(head.val) head = head.next return res if __name__ == "__main__": l1 = arr_to_linkedlist([1,2,3]) l2 = arr_to_linkedlist([1,2,3]) sol = Solution() merged = sol.mergeTwoLists(l1, l2) print(linkedlist_to_arr(merged))
运行代码后会输出正确的合并结果:[1, 1, 2, 2, 3, 3]
调试提示
- 本地调试LeetCode链表类题目时,可以通用上述两个转换函数,快速完成用例构造和结果校验
- 代码中用到了
Optional类型标注,需要从typing模块导入,否则本地运行会报名称未定义错误 - 核心合并双指针逻辑无需修改,提交到LeetCode平台可以直接通过
内容的提问来源于stack exchange,提问作者mahdiahmad
相关产品推荐
相关产品推荐

