微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在python3中使用heapq模块合并k个排序列表

如何解决在python3中使用heapq模块合并k个排序列表

问题:- 合并 k 个排序列表。

我想使用 min heap 解决这个问题,它可以用 python 中的 heapq 模块实现。 下面是函数的示例代码...

heapq.heappush(listwithoutNone,(node.val,node))
        

但问题是python解释器引发了一个错误

类型错误:“ListNode”和“ListNode”的实例之间不支持

所以,我想将 node.val 用作 minheap 节点元素,因为我正在传递一个元组,那么我应该在代码中做哪些更改,以便 minheap 将使用 node.val 堆化堆。

提前致谢。

解决方法

当比较元组时,会比较它们的第一个元素,然后使用它们的第二个元素、它们的元素等打破任何联系。例如,(2,"a") < (2,"b") 的计算结果为 True

在这里,您将 (node.val,node) 元组插入到您的堆中,以尝试比较它们。如果节点值有联系,它会移动到元组的第二个元素——节点本身。这些只是 ListNode 实例。 Python 不知道如何比较两个 ListNodes,因此出现错误。

要启用 ListNodes 之间的比较,您需要实现 rich comparison methods。 一个快速的方法是简单地实现 ListNode.__lt__,然后使用 functools.total_ordering 装饰器:

import heapq
from functools import total_ordering


@total_ordering
class ListNode:
    def __init__(self,value: float,label: str) -> None:
        self.value = value
        self.label = label

    def __lt__(self,other: 'ListNode'):
        return self.value <= other.value

    def __str__(self):
        return f"ListNode(label={self.label},value={self.value})"



nodes = []
a =  ListNode(5,"A")
b = ListNode(3,"B")
c = ListNode(5,"C")
heapq.heappush(nodes,a)
heapq.heappush(nodes,b)
heapq.heappush(nodes,c)

while nodes:
    x = heapq.heappop(nodes)
    print(x)

这里我们说比较两个 ListNode 对象与仅比较它们的值是一样的。定义比较后,您甚至根本不需要插入元组。您可以直接插入 ListNode 对象,并依靠比较方法。

,

我认为你在谈论这个:Leetcode 合并 k 个排序列表

我正在为您分享一个可行的解决方案:

head = curr = ListNode(0)    # Creating a dummy node
    lst = []
    for l in lists:
        if l:
 # Here we need to first push val so that heap can know which is minimum and which is maximum. 
 # If we insert directly node then heap can't work proper way (in this case heapq.heappop doesn't return minimum node).    
            lst.append((l.val,l))    

    
    heapq.heapify(lst)
    while lst:
        val,node = heapq.heappop(lst)
        curr.next = node
        curr = curr.next
        node = node.next
        if node:
            heapq.heappush(lst,(node.val,node))
    return head.next 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。