问题描述
问题:- 合并 k 个排序列表。
我想使用 min heap 解决这个问题,它可以用 python 中的 heapq 模块实现。 下面是函数的示例代码...
heapq.heappush(listwithoutNone,(node.val,node))
类型错误:“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