社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

如何在Python脚本的leetcode测试运行程序中表示这些单链表节点?

Aaron • 3 年前 • 1345 次点击  

我正在努力解决leetcode上的这些链表问题(以及树问题,因为它们使用类似的结构)。实例 https://leetcode.com/problems/merge-two-sorted-lists/

如果我试图在leetcode的魔法盒之外运行这段代码,就会遇到问题。

我的MergeTwoList函数在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>

这是有道理的。它解释了无限循环,当转换为布尔时,类对象eval为True。

基于此,如果我想让代码在leetcode之外运行,我需要做一些不同的事情。我需要更多关于我的类定义的信息,或者我的测试用例设置错误?

有人知道更多关于Leetcode系统中ListNode类的完整定义吗?或者在我应该如何设置考试时,我缺少了什么?

非常感谢。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/133034
 
1345 次点击  
文章 [ 1 ]  |  最新文章 3 年前
Eric Jin
Reply   •   1 楼
Eric Jin    3 年前

是的,你是对的 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

然后 __bool__ 方法将在您尝试执行此操作时调用 list1 and list2 ,它也有同样的行为。