题解 | #合并k个已排序的链表#

合并k个已排序的链表

https://www.nowcoder.com/practice/65cfde9e5b9b4cf2b6bafa5f3ef33fa6

# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param lists ListNode类一维数组 
# @return ListNode类
#

import heapq

class Solution:
    def mergeKLists(self , lists: List[ListNode]) -> ListNode:
        # write code here
        heap = []  # 创建堆

        # 将每个链表的第一个值加入堆,同时将各个链表的头指针往后移动一位
        for i in range(len(lists)):
            if lists[i]:
                heapq.heappush(heap, (lists[i].val, i))
                lists[i] = lists[i].next
        
        dummy_head = ListNode(-1)
        cur = dummy_head

        while heap:
            val, i = heapq.heappop(heap)
            node = ListNode(val)
            cur.next = node
            cur = cur.next
            if lists[i]:
                heapq.heappush(heap, (lists[i].val, i))
                lists[i] = lists[i].next

        return dummy_head.next

思路:使用最小堆来每次pop出每个链表头结点中的最小值

  1. 构建最小堆,将所有链表的头结点push到堆中;
  2. 只要堆不为空,每次pop出当前堆中的最小值,并加入pop出的这个值所在链表的下一个值

为此,在构建堆时,不仅需要记录值,还需要记录该值来自于那个链表。

全部评论

相关推荐

明天不下雨了:兄弟你是我今天看到的最好看的简历(我说的是简历风格跟简历书写)把985 211再搞亮一点。投boss就说;您好,我华科(985)研二在读,本科211。对您的岗位很感兴趣,希望能获得一次投递机会。
点赞 评论 收藏
分享
点赞 评论 收藏
分享
目前感觉简历还有很多问题,希望各位能不吝赐教以及非常感谢这位老哥——@黑皮白袜臭脚体育生 的项目,学完一遍感觉受益颇丰
小菜鸡只想转正:校友,我的建议是冗余的最好去掉,突出重点,比如985,211双一流的提示,专业技能调整到个人项目之后的位置。专业技能感觉写的太细了?占用篇幅最好腾出一点给项目经历,如果没写手机号和邮箱,记得加上。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务