合并两个有序链表触发'NoneType'对象无val属性错误求助
问题描述
编写合并两个有序链表的代码时,已在开头添加输入为None的判断逻辑,仍触发'NoneType' object has no attribute '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 mergeTwoLists(self, list1, list2): """ :type list1: Optional[ListNode] :type list2: Optional[ListNode] :rtype: Optional[ListNode] """ p1 = list1 p2 = list2 newLL = ListNode(None,None) p3 = newLL if p1 is None and p2 is None: return newLL elif p1 is None: return p2 elif p2 is None: return p1 while p1 is not None or p2 is not None: if p1.val <= p2.val: p3.next = p1 p1 = p1.next else: p3.next = p2 p2 = p2.next p3 = p3.next if p1 is None: p3.next = p1 else: p3.next = p2 return newLL.next
报错原因
- 循环条件逻辑错误:代码使用
while p1 is not None or p2 is not None作为循环终止判断,该条件只要任意一个指针未遍历到链表末尾就会进入循环体。开头的空判断仅覆盖参数初始传入时链表为空的场景,遍历过程中如果其中一个指针先走到末尾(值为None),另一个指针还有剩余节点时,进入循环后执行p1.val/p2.val的比较逻辑,就会访问None的val属性触发报错。 - 尾部拼接逻辑错误:循环终止后代码判断
p1 is None时拼接p1,逻辑完全倒置,此时应该拼接另一个非空的剩余链表节点。 - 存在冗余逻辑:开头写的三个初始空判断属于冗余代码,修正后的逻辑可以完全覆盖这部分场景,无需单独判断。
修正方案
修改两处核心逻辑即可:
- 将循环条件的
or替换为and,仅当两个遍历指针都不为空时,才执行节点值比较、指针移动的逻辑 - 循环结束后,直接将未遍历完的非空链表接到结果指针后方即可
修正后可运行代码:
# 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 mergeTwoLists(self, list1, list2): """ :type list1: Optional[ListNode] :type list2: Optional[ListNode] :rtype: Optional[ListNode] """ p1 = list1 p2 = list2 dummy = ListNode() p3 = dummy # 双指针都不为空时才比较值 while p1 and p2: if p1.val <= p2.val: p3.next = p1 p1 = p1.next else: p3.next = p2 p2 = p2.next p3 = p3.next # 拼接剩余非空链表 p3.next = p1 if p1 else p2 return dummy.next
内容的提问来源于stack exchange,提问作者coder1234
相关产品推荐
相关产品推荐

