合并两个有序链表 递归与非递归
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = []输出:[]
示例 3:
输入:l1 = [], l2 = [0]输出:[0]
思路:
这个题有两种思路: 一种就是简单遍历的方法,用双指针分别在两个链表上游走,每次把较小的那个保存到结果链表中; 还有一种就是用递归的方式,我们明确一个函数mergeTwoLists():传入两个链表,返回合并好的链表的头结点。那每次在这个函数的内部,就先找到传入链表中较小的那个头结点,将这个头结点的next与另一个链表再次进入递归merge,并让这个头结点指向这个merge的结果。如此一来,接下去的操作都交给递归即可——只是需要记得定义base case:当其中某一个传入的链表为空时,就直接返回另一个链表。
代码:
法1(递归)
class Solution(object):
def mergeTwoLists(self, l1, l2):
if l1==None:#base case的定义
return l2
if l2==None:
return l1
#谁小,就让让它指向新的结果
if l1.val<l2.val:
#新结果则是小的next与另一个链表的merge
l1.next= self.mergeTwoLists(l1.next,l2)
return l1
else:
l2.next = self.mergeTwoLists(l2.next,l1)
return l2
法2:
class Solution(object):
def mergeTwoLists(self, root1, root2):
p = ListNode()#自己额外创建一个头结点,作为结果链表的头
q = p #q就是一个不变的超节点,因为后面p要一直变,q起暂存作用
while root1 and root2: #遍历两个链表,假如两个链表都还没到末尾
if root1.val<=root2.val: #如果root1小,p就指向这个节点
p.next=root1
p=p.next #然后p和root1同时更新为下一个点
root1= root1.next
else:
p.next=root2
p=p.next
root2 = root2.next
p.next=root1 if root1 else root2 #当有一个为空时,那另一个剩下的全部就是剩余结果部分了。
return q.next
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了