如何在 Python 脚本中表示 leetcode 测试运行程序中的这些单链表节点?
How to represent these singly linked list nodes in the leetcode test runner in a Python script?
我正在努力解决 leetcode 上的这些链表问题(以及树问题,因为它们使用类似的结构)。示例 https://leetcode.com/problems/merge-two-sorted-lists/
如果我尝试 运行 leetcode 魔法盒之外的代码,我 运行 会遇到问题。
我的 mergeTwoLists 函数在 leetcode 编辑器中运行良好(运行s 成功,被接受)
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>
这是有道理的。它解释了无限循环,class objects eval to True when cast to bool.
所以基于此,如果我想将这段代码 运行 放在 leetcode 之外,我需要做一些不同的事情。我的 class 定义需要更多信息,或者我的测试用例设置有误?
有谁知道Leetcode系统中ListNode的完整定义class?或者我应该如何设置我的测试有什么遗漏吗?
谢谢!
所以是的,你是对的,在你的 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 定义了另一种方法。如果您这样定义 class:
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__
方法,它会执行相同的行为。
我正在努力解决 leetcode 上的这些链表问题(以及树问题,因为它们使用类似的结构)。示例 https://leetcode.com/problems/merge-two-sorted-lists/
如果我尝试 运行 leetcode 魔法盒之外的代码,我 运行 会遇到问题。
我的 mergeTwoLists 函数在 leetcode 编辑器中运行良好(运行s 成功,被接受)
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>
这是有道理的。它解释了无限循环,class objects eval to True when cast to bool.
所以基于此,如果我想将这段代码 运行 放在 leetcode 之外,我需要做一些不同的事情。我的 class 定义需要更多信息,或者我的测试用例设置有误?
有谁知道Leetcode系统中ListNode的完整定义class?或者我应该如何设置我的测试有什么遗漏吗?
谢谢!
所以是的,你是对的,在你的 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 定义了另一种方法。如果您这样定义 class:
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__
方法,它会执行相同的行为。