leetcode 23. 合并K个排序链表

  1. 题目链接 https://leetcode-cn.com/problems/merge-k-sorted-lists/

  2. 题目描述

    1. 合并 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
    2. 输入:
      [
        1->4->5,
        1->3->4,
        2->6
      ]
      输出: 1->1->2->3->4->4->5->6
  3. 解题思路

    1. 分治法: 将lists分为左右两部分,分别对左右两部分进行合并,再对返回结果进行合并
    2. 堆:维护一个长度为k的堆,堆的元素为链表的头结点,每次从堆中取出值最小的节点,加入到一个新链表中,然后将最小节点的下一个节点放入堆中
  4. 代码

    1. 分治
      class Solution:
          def mergeKLists(self, lists):
              n = len(lists)
              if n == 1:
                  return lists[0]
              if n == 0:
                  return None
              mid = n // 2
              left = self.mergeKLists(lists[:mid])
              right = self.mergeKLists(lists[mid:])
              res = ListNode(0)
              head = res
              while left and right:
                  if left.val < right.val:
                      left, res.next = left.next, left
                  else:
                      right, res.next = right.next, right
                  res = res.next
      
              res.next = left or right or None
      
              return head.next

       

    2.    class Solution:
          def mergeKLists(self, lists):
      
              n = len(lists)
              if n == 1:
                  return lists[0]     if not lists:
                  return None
              import heapq
              heap = [(l.val, l) for l in lists]
              heapq.heapify(heap)
      
              res = ListNode(0)
              cur = res
              while heap:
                  _min = heapq.heappop()[1]
                  cur.next, _min = _min, _min.next
                  if _min:
                      heapq.heappush(heap, (_min.val, _min))
                  cur = cur.next
              return res.next

       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值