leetcode-合并K个升序链表[23]

题目描述

给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例

image

方法1-stupid

  1. 遍历所有链表将节点值加入列表中,
  2. 对列表进行升序
  3. 根据列表创建新的链表

代码实现

    # 将所有链表元素添加至列表中,然后对列表进行排序,然后基于列表创建链表,
    def mergeKLists_v0(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
        # 创建虚拟节点
        dummy  = ListNode(-1)
        p = dummy
        nums = []
        for l in lists:
            while l:
                nums.append(l.val)
                l = l.next
        for i in sorted(nums):
            p.next = ListNode(nums[i])
            p = p.next

        return dummy.next

方法2-优先队列

算法步骤

  1. 创建虚拟头节点(dummy)
  2. 创建优先队列,将所有链表的头节点加入优先队列中
  3. 若队列不为空:
    1. 取出队列中节点值最小的节点node,根据节点值创建新节点,并链接到头节点后
    2. 移动节点p指向当前节点node,node指向下一个节点
    3. 将node的下一个节点加入优先队列中。

python使用优先队列

# 导包
 from  queue import PriorityQueue
# 创建优先队列
 q = PriorityQueue()
# 添加元素
 q.put((node.val,idx,node))
# 取元素
 node.val,idx,node = q.get()

代码实现

    # 使用优先队列
    def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
        # 创建虚拟节点
        head = p  = ListNode(-1)
        q = PriorityQueue()
        # 将各个链表的头节点添加到队列中
        for i,node in enumerate(lists):
            if node:
                q.put((node.val,i,node))

        while not q.empty():
            val,idx,node = q.get()
            p.next = ListNode(val)
            p = p.next
            node = node.next

            if node:
                q.put((node.val,idx,node))


        return head.next

posted @ 2022-03-11 21:11  topbookcc  阅读(57)  评论(0编辑  收藏  举报
/* 鼠标点击求赞文字特效 */