【Leetcode刷题Python】23. 合并K个升序链表

简介: 合并K个升序链表的方法:使用数组排序的暴力求解法、使用小顶堆的高效方法,以及分而治之的策略,并提供了相应的Python实现代码。

1 题目

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。
输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]

2 解析

注意,最外层是列表,第二层是链表
如上面的[1,4,5]是链表1->4->5
(1)方法一
暴力求解,使用数组来存储所有元素,再对数组排序,最后用有序数组生成链表
(2)方法二
使用小顶堆,采用python包的heapq

(3)方法三
分而治之,使用两个链表的合并为有序的方法

3 python实现

(1)方法一

 # 暴力求解,使用数组来存储所有元素,再对数组排序,最后用有序数组生成链表

    def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
        temp = []
        for i in lists:
            while i:
                temp.append(i.val)
                i =i.next
        temp.sort()
        p = dummy  = ListNode(0)
        for j in temp:
            p.next = ListNode(j)
            p = p.next
        return dummy.next

(2)方法二

    # 使用小顶堆
    def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
        import heapq
        head = []
        for i in lists:
            while i:
                heapq.heappush(head,i.val)
                i = i.next
        p = dummy = ListNode(0)
        while head:
            val = heapq.heappop(head)
            p.next = ListNode(val)
            p = p.next
        return dummy.next

(3)方法三

    # 分而治之,使用两个链表的合并为有序的方法
    def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
        if len(lists) ==0:
            return ListNode().next
        res = lists[0]
        for i  in range(1,len(lists)):
            res = self.mergeTwoList(res,lists[i])
        return res


    def mergeTwoList(self, a:ListNode,b:ListNode) ->ListNode:
        if not a:
            return b
        if not b:
            return a
        p,q = a,b
        tail = head = ListNode(0)
        while p and q:
            if p.val <q.val:
                tail.next = p
                p = p.next
            else :
                tail.next = q
                q = q.next
            tail = tail.next
        tail.next =q if q else p
        return head.next
目录
相关文章
|
5月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
56 1
|
5月前
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
76 0
Leetcode第21题(合并两个有序链表)
|
10天前
|
存储 Python
Python 实现单向链表,和单向链表的反转
链表是一种数据结构,每个节点存储相邻节点的位置信息。单链表中的节点仅存储下一节点的位置。通过Python实现单链表,定义`ListNode`类并关联节点可创建链表。例如,创建A-&gt;B-&gt;C的链表后,可通过反转函数`reverse`将链表反转为CBA。代码展示了如何实现和操作单链表。
Python 实现单向链表,和单向链表的反转
|
5月前
|
算法
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
56 0
|
17天前
|
存储 算法 搜索推荐
Python 实现反转、合并链表有啥用?
大家好,我是V哥。本文介绍Python实现反转链表和合并链表的应用场景及代码实现。反转链表适用于时间序列数据展示、回文链表判断等;合并链表则用于大规模数据排序、数据库查询结果集合并等。通过迭代和递归方法实现反转链表,以及合并两个或多个有序链表的算法,帮助开发者解决实际问题。关注V哥,了解更多实用编程技巧。 先赞再看后评论,腰缠万贯财进门。
|
2月前
|
Python
探索 Python 中链表的实现:从基础到高级
链表是一种由节点组成的基础数据结构,每个节点包含数据和指向下一个节点的引用。本文通过Python类实现单向链表,详细介绍了创建、插入、删除节点等操作,并提供示例代码帮助理解。链表在处理动态数据时具有高效性,适用于大量数据变动的场景。文章为初学者提供了全面的入门指南,助你掌握链表的核心概念与应用。
|
5月前
|
搜索推荐 Python
Leecode 101刷题笔记之第五章:和你一起你轻松刷题(Python)
这篇文章是关于LeetCode第101章的刷题笔记,涵盖了多种排序算法的Python实现和两个中等难度的编程练习题的解法。
44 3
|
5月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
51 0
LeetCode第二十四题(两两交换链表中的节点)
|
5月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
60 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
5月前
|
算法 C++ Python
Leecode 101刷题笔记之第四章:和你一起你轻松刷题(Python)
这篇博客是关于LeetCode上使用Python语言解决二分查找问题的刷题笔记,涵盖了从基础到进阶难度的多个题目及其解法。
41 0

热门文章

最新文章