最简单的暴力求解法
将所有链表的值,都添加到一个列表中,排序后,再构造结果。(没啥结束含量)
优先队列
将所有链表的值,都添加到一个优先队列中,再构造结果。(有技术含量了哈哈哈)
原来是这样写的
leetcode上有人是这样写的。但是改变测试用例还是会出现TypeError: '<' not supported between instances of 'ListNode' and 'ListNode'
,只要index相同,并且节点的val值也相同,那就不得不比较两个ListNode,但是优先队列又无法比较ListNode。因此就出现了以上的错误。
两种实现思路:
1. 自己实现比较的方法__it__,eq
2. 定义一个自增的变量,保证每一次的index不同
from queue import PriorityQueue
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution(object):
def mergeKLists(self, lists):
"""
:type lists: List[ListNode]
:rtype: ListNode
"""
head = point = ListNode(0)
q = PriorityQueue()
for index, node in enumerate(lists):
if node:
q.put((node.val, index, node)) # index是绝对不可能重的
while not q.empty():
val, index,node = q.get()
point.next = ListNode(val)
point = point.next
node = node.next
if node:
q.put((node.val,index+1, node))
return head.next
之后改进的
from queue import PriorityQueue
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution(object):
def mergeKLists(self, lists):
"""
:type lists: List[ListNode]
:rtype: ListNode
"""
index = 0
head = point = ListNode(0)
q = PriorityQueue()
for l in lists:
if l:
q.put((l.val,index, l))
index +=1
while not q.empty():
val,index, node = q.get()
point.next = ListNode(val)
point = point.next
node = node.next
if node:
q.put((node.val,index, node))
index+=1
return head.next