题目
合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。
数据范围:节点总数 0 \le n \le 50000≤n≤5000,每个节点的val满足 |val| <= 1000∣val∣<=1000
要求:时间复杂度 O(nlogn)O(nlogn)
示例1
输入:[{1,2,3},{4,5,6,7}]
返回值:{1,2,3,4,5,6,7,8}
示例2
输入:[{1,2},{1,4,5},{6}]
返回值:{1,1,2,4,5,6}
解题思路
1、采用优先队列,依次链表节点放入队列中,生成小顶堆(非叶子节点不大于左孩子和右孩子)
2、依次获取堆顶元素
3、形成新的链表
题解(采用Python库--heapq)
import re
from heapq import merge
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param lists ListNode类一维数组
# @return ListNode类
#引入heapq库
import heapq
class Solution:
# 将int类型转换为ListNode类型
def transform(self,n):
return ListNode(n)
def mergeKLists(self , lists: List[ListNode]) -> ListNode:
# 1.列表长度小于2时,空链表返回None,若只含一个结点直接返回元素
if len(lists) < 2:return lists[0] if lists else None
flag=0
new=[]
new_lists=None
# 2.将结点依次存入优先队列中
for ListNode in lists:
node = ListNode
if node is not None: flag=1
while node:
heapq.heappush(new,node.val)
node = node.next
if flag==0:return None
# 3.转换为小顶堆
heapq.heapify(new)
# 4.生成新的链表
l=len(new)
new_lists = self.transform(heapq.heappop(new))
p = new_lists
for i in range(l):
if i ==0:continue
if p:
p.next = self.transform(heapq.heappop(new))
p= p.next
return new_lists