leetcode23合并k个有序链表。优先队列(最小堆)python 代码+思路

"""
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:
输入:
[1->4->5,
  1->3->4,
  2->6]
输出: 1->1->2->3->4->4->5->6
"""

'''
思考:
三种方法:暴力、分治、最小堆(优先队列)
暴力解法有两种,一种是12排,然后和3,然后和4,继续下去;
另一种是先放到一个数组中进行排序,然后按照顺序连接

分而治之:两两合并
如果有k个链表,平均每个链表有n个节点
那么,第一轮,k/2次,每次2n个节点
第二轮 k/4次,每次4n数字
......
最后一轮  k/k次,每次kn数字
总共复杂度为Kn*(logk)


我实现的是最小堆:
最小堆:很简单,将每个链表的头节点放到一起,组成最小堆,然后输出最小堆顶进行最终结果链表
然后该节点对应的原始链表后移

'''

import heapq


# Definition for singly-linked list.
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution:
    def mergeKLists(self, lists):
        if len(lists) == 0:
            return
        elif len(lists) == 1:
            return lists[0]
        else:
            min_heap = []
            ans = cur = ListNode(-1)
            for i in range(len(lists)):
                if lists[i]:
                    heapq.heappush(min_heap, (lists[i].val, i))
            while min_heap:
                val, index = heapq.heappop(min_heap)
                cur.next = ListNode(val)
                cur = cur.next
                lists[index] = lists[index].next
                if lists[index]:
                    heapq.heappush(min_heap, (lists[index].val, index))
            return ans.next


l1 = ListNode(1)
l1.next = ListNode(2)
l1.next.next = ListNode(3)
l2 = ListNode(1)
l2.next = ListNode(3)
l2.next.next = ListNode(4)
l3 = ListNode(4)
l3.next = ListNode(6)
l3.next.next = ListNode(7)

Solution().mergeKLists([l1, l2, l3])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值