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

LeetCode hot100:234 回文链表:快慢指针巧判回文链表

问题描述:

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

示例1:

输入:head = [1,2,2,1]

输出:true

示例2:

输入:head = [1,2]

输出:false

解决方法:

方法一:数组+双指针

算法思路:

  1. 遍历链表,将节点值复制到数组中;

  2. 使用双指针法判断数组是否为回文。

代码实现:

def isPalindrome(head):values = []curr = headwhile curr:values.append(curr.val)curr = curr.nextleft, right = 0, len(values) - 1while left < right:if values[left] != values[right]:return Falseleft += 1right -= 1return True

复杂度分析:

  • 时间复杂度:O(n),需要遍历链表和数组各一次
  • 空间复杂度:O(n),需要额外的数组空间存储节点值

方法二:快慢指针+翻转

算法思路:

  1. 使用快慢指针找到链表中点;

  2. 反转后半部分链表;

  3. 比较前半部分和反转后的后半部分。

代码实现:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def isPalindrome(self, head: Optional[ListNode]) -> bool:# 快慢指针if not head or not head.next:return Truefast = low = head# 查找反转的起点while fast and fast.next:low = low.nextfast = fast.next.next# 反转后半部分链表prev = Nonecur = lowwhile cur: # 迭代反转nxt = cur.nextcur.next = prevprev = curcur = nxt# 链表比较left = headright = prevwhile right:if left.val != right.val:return Falseleft = left.nextright = right.nextreturn True

复杂度分析:

  • 时间复杂度:O(n),遍历链表的次数是常数倍
  • 空间复杂度:O(1),只使用了几个指针变量

问题详解:

以链表 [ 1,2,3,2,1]为例说明方法二:

1、快慢指针找中点:

  • 慢指针每次走1步,快指针每次走2步;
  • 最终慢指针会停在节点3上。

2、反转后半部分:

  • 将 [3,2,1]反转为[1,2,3];
  • 此时链表的结构被修改,但比较阶段不需要完整的结构。

3、比较前后部分:

  • 前半部分: [1,2,3];
  • 后半部分(反转后):[1,2,3];
  • 逐个比较对应节点值。

关键点说明

  • 为什么在比较部分要使用 while right:后半部分长度总是整体的一部分,小于等于前半部分长度,确保只比较必要的节点对数;
  • 链表的结构改变:方法二会改变链表的结构,但是比较完成后通常不需要恢复;
  • 边界情况处理:空链表和单节点链表直接返回 true。

总结:

方法优点缺点适用情况
数组+双指针思路简单,不易出错需要额外O(n)空间对空间要求不高的场景
快慢指针+翻转空间复杂度O(1)会修改原链表结构对空间有严格要求的场景

通常情况下期望掌握第二种方法,因为它展示了更多的链表操作技巧。

http://www.dtcms.com/a/598620.html

相关文章:

  • 合肥网站建设方案服务营销网站搭建建议
  • 【python】生成器
  • 昆明展示型网站开发网站添加百度地图导航
  • 网站地图什么时候提交好广州网站建设推广方法
  • python的网站开发免费软件库下载
  • 阿里云服务器创建网站吗动漫制作专业用什么笔记本电脑
  • 若依 springBoot 配置国际化
  • 十年经验网站开发公司安阳市商祺网络有限责任公司
  • 网络初识~
  • 织梦怎么做中英文网站做网站只做前端可以用吗
  • C 语言17:位操作符 | ^:从二进制编码到大小端
  • 计算机网站php设计代做平台公司和项目公司的区别
  • flowable04网关和变量
  • 设计旅游网站的主色调sem工具是什么
  • 如何降低交互复杂度,减少用户学习成本
  • 交易类网站做支付宝功能淘宝网站代理怎么做
  • 中国建设银行网站如何注册logo设计公司 南京
  • 麒麟桌面操作系统切换到root用户方法
  • 找企业名录的网站网站的横幅怎么做
  • 工具学习_Vulrule
  • 上海外贸soho网站建设静态网站登陆怎么做
  • 哈希表中桶的概念
  • 网站建设系统设计重庆百度搜索排名优化
  • 中山快速做网站服务盐城网站建设流程
  • LangFlow 中,节点间的数据流动核心是 **“输入-输出端口映射”+“执行链路驱动”**
  • 百度上怎么制作自己的网站中文网页设计案例欣赏
  • 深度学习:python动物识别分类检测系统 Django框架 CNN算法 深度学习 卷积神经网络 TensorFlow (建议收藏)✅
  • 【C++基础与提高】第四章:运算符与表达式——构建程序逻辑的工具
  • 专业提供网站制作双语言网站源码
  • 太原论坛网站开发公司芜湖网站公司