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

合并两个有序链表触发'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,逻辑完全倒置,此时应该拼接另一个非空的剩余链表节点。
  • 存在冗余逻辑:开头写的三个初始空判断属于冗余代码,修正后的逻辑可以完全覆盖这部分场景,无需单独判断。
修正方案

修改两处核心逻辑即可:

  1. 将循环条件的or替换为and,仅当两个遍历指针都不为空时,才执行节点值比较、指针移动的逻辑
  2. 循环结束后,直接将未遍历完的非空链表接到结果指针后方即可

修正后可运行代码:

# 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:18:36