leetcode-合并K个升序链表[23]
题目描述
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例
方法1-stupid
- 遍历所有链表将节点值加入列表中,
- 对列表进行升序
- 根据列表创建新的链表
代码实现
# 将所有链表元素添加至列表中,然后对列表进行排序,然后基于列表创建链表,
def mergeKLists_v0(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
# 创建虚拟节点
dummy = ListNode(-1)
p = dummy
nums = []
for l in lists:
while l:
nums.append(l.val)
l = l.next
for i in sorted(nums):
p.next = ListNode(nums[i])
p = p.next
return dummy.next
方法2-优先队列
算法步骤
- 创建虚拟头节点(dummy)
- 创建优先队列,将所有链表的头节点加入优先队列中
- 若队列不为空:
- 取出队列中节点值最小的节点node,根据节点值创建新节点,并链接到头节点后
- 移动节点p指向当前节点node,node指向下一个节点
- 将node的下一个节点加入优先队列中。
python使用优先队列
# 导包
from queue import PriorityQueue
# 创建优先队列
q = PriorityQueue()
# 添加元素
q.put((node.val,idx,node))
# 取元素
node.val,idx,node = q.get()
代码实现
# 使用优先队列
def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
# 创建虚拟节点
head = p = ListNode(-1)
q = PriorityQueue()
# 将各个链表的头节点添加到队列中
for i,node in enumerate(lists):
if node:
q.put((node.val,i,node))
while not q.empty():
val,idx,node = q.get()
p.next = ListNode(val)
p = p.next
node = node.next
if node:
q.put((node.val,idx,node))
return head.next