如何在单条if语句中判断节点是否为None并比较数据以简化链表合并代码
单链表合并代码的简化优化方案
你的mergeLists函数逻辑正确且能正常运行,但确实有简化空间。你之前尝试的单条if语句if head2 is None or head1.data <= head2.data:出现NoneType比较错误,原因是逻辑或or的短路规则:只有前半部分条件为False时,才会执行后半部分。如果head1为None但head2不为空,代码会去访问head1.data,触发AttributeError。
下面提供两种简化思路:
思路一:简化剩余节点处理
原代码在循环中逐个处理空链表的节点,其实循环结束后直接拼接剩余的整个链表即可——因为剩余部分本身已是有序状态,无需逐个节点遍历:
def mergeLists(head1, head2): dummy = SinglyLinkedListNode(None) current = dummy # 仅处理两个链表都有节点的场景 while head1 and head2: if head1.data <= head2.data: current.next = head1 head1 = head1.next else: current.next = head2 head2 = head2.next current = current.next # 直接拼接剩余的非空链表 current.next = head1 if head1 else head2 return dummy.next
思路二:调整条件顺序修复单if判断
如果想保留你最初的单条件判断逻辑,只需调整条件顺序,确保访问节点data前,该节点不为空:
def mergeLists(head1, head2): dummy = SinglyLinkedListNode(None) current = dummy while head1 or head2: # 先判断head1存在,再判断后续条件(利用逻辑与的短路特性) if head1 is not None and (head2 is None or head1.data <= head2.data): current.next = head1 head1 = head1.next else: current.next = head2 head2 = head2.next current = current.next return dummy.next
这个版本通过逻辑与and的短路特性,确保只有head1不为空时,才会执行后面的head2状态判断或数据比较,从根源避免了NoneType错误。
内容的提问来源于stack exchange,提问作者Alex Song
相关产品推荐
相关产品推荐

