算法第五天-合并K个升序链表

合并K个升序链表

题目要求

算法第五天-合并K个升序链表_第1张图片

解题思路

方法一:最小堆
来自【灵茶山艾府】
合并后的第一个节点first,一定是某个链表的头节点(因为链表已按升序排列)。
合并后的第二个节点,可能是某个链表的头节点,也可能是 first 的下一个节点。
例如有三个链表 1->2->5, 3->4->6, 4->5->6,找到第一个节点 1 之后,第二个节点不是另一个链表的头节点,而是节点 1 的下一个节点 2。
按照这个过程继续思考,每当我们找到一个节点值最小的节点 x,就把节点 x.next 加入「可能是最小节点」的集合中。
因此,我们需要一个数据结构,它支持:
从数据结构中找到并移除最小节点。
插入节点。
这可以用最小堆实现。初始把所有链表的头节点入堆,然后不断弹出堆中最小节点 x,如果 x.next 不为空就加入堆中。循环直到堆为空。把弹出的节点按顺序拼接起来,就得到了答案。

代码

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
ListNode.__lt__ = lambda a,b: a.val < b.val  # 让堆可以比较节点大小
class Solution:
    def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
        cur = dummy = ListNode()
        h = [head for head in lists if head]
        heapify(h)
        while h:
            node = heappop(h)
            if node.next:
                heappush(h,node.next)
            cur.next = node
            cur = cur.next
        return dummy.next

复杂度分析

时间复杂度: O ( n l o g k ) O(nlog{k}) O(nlogk) k k k为list的长度
空间复杂度: O ( n ) O(n) O(n)

你可能感兴趣的:(算法,链表,python)