我正在努力解决leetcode上的这些链表问题(以及树问题,因为它们使用类似的结构)。例如https://leetcode.com/problems/merge-two-sorted-lists/
如果我试图在leetcode的魔法盒之外运行这段代码,我就会遇到问题。
我的mergeTwoLists函数在leetcode编辑器中工作得很好(运行成功,被接受)
from typing import Optional
# Definition for singly-linked list.
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def mergeTwoLists(list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
prehead = ListNode(-1)
prev = prehead
while list1 and list2:
if list1.val <= list2.val:
prev.next = list1
list1 = list1.next
else:
prev.next = list2
list2 = list2.next
prev = prev.next
breakpoint()
prev.next = list1 if list1 is not None else list2
return prehead.next
if __name__ == '__main__':
l1 = ListNode(1)
l1_2 = ListNode(2)
l1_3 = ListNode(4)
l1.next = l1_2
l1_2.next = l1_3
l2 = ListNode(1)
l2_2 = ListNode(3)
l2_3 = ListNode(4)
l2.next = l1_2
l2_2.next = l1_3
print(mergeTwoLists(l1, l2))
问题是,当我试图从我的终端独立运行上面的程序时,它会进入一个无限循环。
原因是由于我传递给函数的内容,如果我在第一个循环结束时抛出断点()并检查list1和list2
(Pdb) list1
<__main__.ListNode object at 0x00000294E1F8FEE0>
(Pdb) list2
<__main__.ListNode object at 0x00000294E1F8FE20>
说得通。它解释了无限循环,类对象在转换为bool时eval为True。
基于此,如果我想让这段代码在leetcode之外运行,我需要做一些不同的事情。我需要更多的信息为我的类定义,或者我的测试用例设置是错误的?
有谁知道更多关于ListNode类在Leetcode系统中的完整定义吗?或者我在如何设置测试时遗漏了什么?
谢谢!
所以,是的,你是正确的,在你的while list1 and list2
上,这计算为True
。
你可以这样解决它,更明确:
def mergeTwoLists(list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
prehead = ListNode(-1)
prev = prehead
while (list1.next is not None) and (list2.next is not None):
if list1.val <= list2.val:
prev.next = list1
list1 = list1.next
else:
prev.next = list2
list2 = list2.next
prev = prev.next
prev.next = list1 if list1 is not None else list2
return prehead.next
它可能在leetcode中工作,因为它们定义了类的另一个方法。如果您像这样定义类:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def __bool__(self):
"""Return bool(self)."""
return self.next is not None
当您尝试执行list1 and list2
时,将调用__bool__
方法,并执行相同的行为。