【发布时间】:2022-01-05 11:57:19
【问题描述】:
我认为标题比实际问题描述更令人困惑。所以这里是
我有一个python 链表列表,看起来像lists = [[1,4,5],[1,3,4],[2,6]],链表节点定义为
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
在我试图解决的问题中,第一步是将每个列表的第一个元素放入堆中。这是我的代码:
mylist1 = ListNode(1, ListNode(4, ListNode(5)))
mylist2 = ListNode(1, ListNode(3, ListNode(4)))
lists = [mylist1, mylist2]
import heapq
heap = []
for l in lists:
heapq.heappush(heap, (l.val, l))
当我运行此代码时,出现以下异常:
Traceback (most recent call last):
File "<pyshell#29>", line 2, in <module>
heapq.heappush(heap, (l.val, l))
TypeError: '<' not supported between instances of 'ListNode' and 'ListNode'
我想我明白那里发生了什么,python 将l 不作为单个节点,而是作为一个完整的列表。所以我的问题是,如何将每个列表中的第一个节点放入python 的堆中?我觉得答案很简单,但我错过了一些重要的东西。
编辑
我正在尝试解决这个问题,https://leetcode.com/problems/merge-k-sorted-lists/。方法是使用堆,但我不想将所有元素都插入其中,我想做的是插入每个列表的第一个元素,找到最小元素,然后从列表中插入下一个元素有最小值等等,直到我遍历所有元素。
【问题讨论】:
-
heapq实现了一个最小堆,当你插入时它会在堆中的元素之间进行一些比较。您插入了 (int, ListNode) 的 2 个元组,并且由于元组中第一项的 int 值存在平局,因此它移至比较中的第二项。 ListNodes 没有实现比较,这导致了错误。我认为这与将l视为列表无关。 -
请说明您试图解决哪个更高级别的问题?这里的大局是什么?
-
@trincot 我在问题末尾添加了一个编辑。
标签: python linked-list heap