【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
目录
相关文章
|
9月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
99 1
|
9月前
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
119 0
Leetcode第21题(合并两个有序链表)
|
3月前
|
存储 Python
Python 中链表的个人理解
简介:本文介绍了Python中链表的基本组成及其操作实现。链表由`head`(头节点)、中间节点和`tail`(尾节点)三部分构成,每个节点通过`Node`类定义,包含`value`(值域)和`next`(指针域)。示例代码展示了链表的增删查功能,包括`add`(头部插入)、`append`(尾部插入)、`remove`(删除节点)、`search`(查找节点)及遍历方法。运行结果验证了链表操作的正确性。
|
3月前
|
算法 Go
【LeetCode 热题100】23:合并 K 个升序链表(详细解析)(Go语言版)
本文详细解析了 LeetCode 热题 23——合并 K 个升序链表的两种解法:优先队列(最小堆)和分治合并。题目要求将多个已排序链表合并为一个升序链表。最小堆方法通过维护节点优先级快速选择最小值,;分治合并则采用归并思想两两合并链表。文章提供了 Go 语言实现代码,并对比分析两种方法的适用场景,帮助读者深入理解链表操作与算法设计。
117 10
|
5月前
|
存储 Python
Python 实现单向链表,和单向链表的反转
链表是一种数据结构,每个节点存储相邻节点的位置信息。单链表中的节点仅存储下一节点的位置。通过Python实现单链表,定义`ListNode`类并关联节点可创建链表。例如,创建A-&gt;B-&gt;C的链表后,可通过反转函数`reverse`将链表反转为CBA。代码展示了如何实现和操作单链表。
102 6
Python 实现单向链表,和单向链表的反转
|
9月前
|
算法
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
83 0
|
5月前
|
存储 算法 搜索推荐
Python 实现反转、合并链表有啥用?
大家好,我是V哥。本文介绍Python实现反转链表和合并链表的应用场景及代码实现。反转链表适用于时间序列数据展示、回文链表判断等;合并链表则用于大规模数据排序、数据库查询结果集合并等。通过迭代和递归方法实现反转链表,以及合并两个或多个有序链表的算法,帮助开发者解决实际问题。关注V哥,了解更多实用编程技巧。 先赞再看后评论,腰缠万贯财进门。
|
6月前
|
Python
探索 Python 中链表的实现:从基础到高级
链表是一种由节点组成的基础数据结构,每个节点包含数据和指向下一个节点的引用。本文通过Python类实现单向链表,详细介绍了创建、插入、删除节点等操作,并提供示例代码帮助理解。链表在处理动态数据时具有高效性,适用于大量数据变动的场景。文章为初学者提供了全面的入门指南,助你掌握链表的核心概念与应用。
247 0
|
8月前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
203 1
|
9月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
96 0
LeetCode第二十四题(两两交换链表中的节点)

热门文章

最新文章

推荐镜像

更多