当前位置: 首页 > news >正文

【LeetCode 234】回文链表 —— 算法进阶:时间复杂度 O(n),空间复杂度 O (1)

题目:给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。

提示:

  • 链表中节点数目在范围[1, 105] 内

  • 0 <= Node.val <= 9

进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?


上一篇文章中我介绍了一个最简单的方法——使用集合。但这种方法会牺牲一些效率,因为 List 的操作通常比直接操作链表节点要慢,尤其是在涉及到频繁插入和删除操作时。此外,使用 List 会增加空间复杂度,因为你需要额外的空间来存储链表的元素。所以我又找到一个原地操作链表的高效算法,能实现时间复杂度为 O(n) 和 空间复杂度为 O(1) 。

首先,找到链表的中点并反转后半部分链表。接着,比较前半部分和反转后的后半部分是否相同。最后,根据比较结果返回 true 或 false。如果需要保持原链表的结构不变,可以在返回结果之前恢复链表的后半部分。

算法步骤:

  1. 找到链表的中点:使用快慢指针法,快指针每次移动两步,慢指针每次移动一步,当快指针到达链表末尾时,慢指针将位于链表的中点。

  2. 反转链表的后半部分:从中点开始反转链表的后半部分。

  3. 比较前半部分和反转后的后半部分:从链表的开始和中点开始,逐个比较节点的值,如果所有值都相同,则链表是回文的。

  4. 恢复链表(可选):如果需要保持原链表的结构不变,可以再次反转链表的后半部分以恢复原链表。

  5. 返回结果:如果链表是回文的,返回 true;否则,返回 false。

复杂度:

  • 时间复杂度:O(n),其中 n 是链表的长度。

  • 空间复杂度:O(1),算法是原地进行的,不占用额外的空间(除了几个指针变量)。

我的 Java 代码:

class Solution {public boolean isPalindrome(ListNode head) {if (head == null || head.next == null) {return true;}// 步骤1: 找到链表的中点ListNode slow = head;ListNode fast = head;while (fast.next != null && fast.next.next != null) {slow = slow.next;fast = fast.next.next;}// 步骤2: 反转链表的后半部分ListNode prev = null;while (slow != null) {ListNode Temp = slow.next;slow.next = prev;prev = slow;slow = Temp;}// 步骤3: 比较前半部分和反转后的后半部分ListNode firstHalf = head;ListNode secondHalf = prev;boolean isPalin = true;while (secondHalf != null) {if (firstHalf.val != secondHalf.val) {isPalin = false;break;}firstHalf = firstHalf.next;secondHalf = secondHalf.next;}// 步骤4: 返回结果return isPalin;}
}
http://www.vanclimg.com/news/492.html

相关文章:

  • Navicat Premium 数据库管理工具 v17.1.10 绿色版
  • 线性筛筛一般积性函数
  • 昨日总结
  • 差分探头都能测那些信号呢?
  • VisualCppRedist 运行库合集 v84
  • word自定义标序号
  • 完整深度学习环境安装指南 (PyTorch 2.7.1 + CUDA 12.8)
  • genieacs脚本配置
  • Nodej - *--_
  • 基于 PKDV508E 高压差分探头的电机反电动势测试方案
  • 数字孪生:驱动工厂智能化转型的核心技术
  • 公告
  • USB转串口硬件电路CH340
  • 完全开启PC端虚拟化(docker无法成功运行的)
  • 【SAE独立出版、EI检索】2025年飞行器控制与导航技术国际学术会议(ACNT 2025)
  • 2025年7月28日测试
  • 文字转语音软件 VPot v2411
  • 【LeetCode 234】算法:回文链表
  • 开发转产品的第88天 07-28
  • 高效查日志进阶指南:掌握grep命令的完整技巧
  • CF2097F Lost Luggage 题解
  • 删除某网盘附带的“智能看图”
  • pgcenter
  • AdventureX 2025赛后感想
  • Vue2.0 兼容IE哪个版本以上吗?
  • 优雅的中间件架构实现:Rust高性能Web框架解析
  • flutter上手 - ---空白--
  • WinNTSetup 系统安装利器 v5.4.0 单文件版
  • Docker-避坑:Mysql配置
  • workbench mechanical中的接触