如何在 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__ 方法,它会执行相同的行为。