143. 重排链表
问题链接
https://leetcode.cn/problems/reorder-list/description/
解题思路
这题其实用list + 双指针模拟。很简单。 但我们要练习的是递归。
这题我本来是想用递归的方式进行模拟,但出了点问题。发现如果这样实现会有循环引用问题。
本着有简单的不用难的的原则,我开始尝试其他递归的手段。
首先分析题意,这个题目说实在的,就是将链表从中间分成两半(如果是奇数的话,左边的链表会多分一个节点),然后将第二个链表逆序,最后将2个链表的对位节点连接起来。
仔细想想,我们需要这么几个操作:
- 找到链表的中间节点。
- 将第二个链表逆序。
- 把两个链表连接起来。
其中,2和3可以用递归解决,1可以用快慢指针解决。
代码
class Solution: def reorderList(self, head) -> None: """ Do not return anything, modify head in-place instead. """ mid = self.search_mid(head) l1 = head l2 = mid.next mid.next = None l2 = self.reverse(l2) self.merge(l1, l2, l1)
#last 代表结果链表 def merge(self, l1, l2, last): if l1 is None and l2 is None: return None if l2 is None: if last == l1: pass else: last.next = l1 return self.merge(l1.next, l2, l1) else: nxt_l1 = l1.next nxt_l2 = l2.next l2.next = l1.next l1.next = l2 return self.merge(nxt_l1, nxt_l2, l2) def reverse(self, head): if head is None or head.next is None: return head last_head = self.reverse(head.next) head.next.next = head head.next = None return last_head def search_mid(self, head): low = fast = head while fast and fast.next: low = low.next fast = fast.next.next return low
分类:
leetcode-递归
, leetcode中等题
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!