合并K个升序链表

23. 合并K个升序链表

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

请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例 1:

输入:lists = [[1,4,5],[1,3,4],[2,6]]

输出:[1,1,2,3,4,4,5,6]

解释:链表数组如下:

[

  1->4->5,

  1->3->4,

  2->6

]

将它们合并到一个有序链表中得到。

1->1->2->3->4->4->5->6

示例 2:

输入:lists = []

输出:[]

示例 3:

输入:lists = [[]]

输出:[]

思路分析:

    这道题和21. 合并两个有序链表很类似了。区别就是21题只是合并两个有序链表即可,而这个就是把合并的思路放到多个链表里去。可以偷个懒,复用一下之前写过的代码。

    问题就是怎么对这个列表中的链表们进行合并呢?有一种方法,取前两个合并,然后再把合并的结果和第三个合并,再把总合并结果和第四个合并……如果用这种方法提交,则超时,因为显然有太多冗余的合并。最合适的方法,自然是两两合并,然后再相互合并。比如有一个列表里有4个链表,则1和2合并出1-2,3和4合并出3-4,再1-2和3-4合并出最终结果。这种合并方式的实现方法也挺简单:对于这个列表,不断取出前两个链表来合并,将结果append进列表末尾,直到最终列表里只剩下一个最终结果。

代码:

class Solution(object):

    def mergeKLists(self, lists):

        if not lists:

            return

        def merge(l1,l2):#复用了第21题合并两个列表的代码,这里用的是递归的方法。

            if not l1:return l2

            if not l2:return l1

            if l1.val<l2.val:

                l1.next = merge(l1.next,l2)

                return l1

            else:

                l2.next = merge(l1,l2.next)

                return l2

        while len(lists)>1:#一直重复这样的操作,直到列表中只剩下一个结果

            a = lists.pop(0) #弹出、合并、添加进末尾

            b = lists.pop(0)

            c = merge(a,b)

            lists.append(c)

        return lists[0]

    虽然是个困难题,但是有了之前合并两个链表的基础,还是比较容易改写的。最后两两合并链表的复杂度,应该是log2n,也并不太大。

posted @   JunanP  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示