合并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,也并不太大。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了