python-3.x 如何检查节点是否为none并将其数据与同一if语句中的另一个节点进行比较

mwkjh3gx  于 2022-12-27  发布在  Python
关注(0)|答案(1)|浏览(165)

我找不到简化此代码的方法

def mergeLists(head1, head2):
    tempNode = returnNode = SinglyLinkedListNode(None)
    while head1 is not None or head2 is not None:
        if head2 is None:
            tempNode.next = head1
            head1 = head1.next       
        elif head1 is None:
            tempNode.next = head2
            head2 = head2.next
        elif head1.data <= head2.data:
            tempNode.next = head1
            head1 = head1.next           
        else:
            tempNode.next = head2
            head2 = head2.next
        tempNode = tempNode.next
    return returnNode.next

最初我写了一个if语句和一个else语句,if语句是:

if head2 is None or head1.data <= head2.data:

这给了我一个比较Nonetype的问题。我想虽然这个版本可以工作,但应该有一个方法来简化它,有人能在这方面帮助我吗?

dsekswqp

dsekswqp1#

只要两个列表引用中的一个None,就退出循环,这样可以保存一些代码(和运行时间)。
1.您不必在循环体内部测试这些列表引用中是否有一个是None,因为可以确保None也不是。
1.在循环之后,你可以通过设置next对剩余列表的引用来追加剩余的列表节点,因为该列表已经正确地连接了它的剩余节点,所以不需要迭代这些节点。
1.你可以删除一些重复的代码,并使用一个值为0或1的 index 来确定哪个列表的值最小,表示它是两个列表中的哪一个。它可以是一个布尔表达式,表示第二个数据是否小于第一个。如果你在一个两个列表中也有两个列表引用,那么你可以用一种通用的方式来处理循环体的逻辑。
1.这并不是要减少代码,但是我会使用名称tail来表示当前已合并部分的尾节点,这比tempNode更具描述性,而且returnNode并不是它所表示的那样,因为实际上您返回的是之后的节点,所以我建议使用名称beforeHead

def mergeLists(head1, head2):
    heads = [head1, head2]  # Use a list
    tail = beforeHead = SinglyLinkedListNode(None)
    while all(heads):  # A more strict condition: exit when one head is None
        least = heads[0].data > heads[1].data
        tail.next = tail = heads[least]  # assignment is first to tail.next, then tail
        heads[least] = tail.next
    tail.next = heads[0] or heads[1]  # Attach the remaining nodes
    return beforeHead.next

相关问题