Leetcode 剑指 Offer II 027. 回文链表

news2024/11/22 8:57:48

题目难度: 简单

原题链接

今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~

题目描述

给定一个链表的 头节点 head ,请判断其是否为回文链表。

如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。

示例 1:

  • 输入: head = [1,2,3,3,2,1]
  • 输出: true

示例 2:

  • 输入: head = [1,2]
  • 输出: false

提示:

  • 链表 L 的长度范围为 [1, 10^5]
  • 0 <= node.val <= 9

题目思考

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

解决方案

思路

  • 相比传统的数组或者字符串求回文, 链表不能直接取下标, 也无法像双向链表那样用双指针往中间靠拢比较的方法, 如何做到 O(n) 时间复杂度和 O(1) 空间复杂度呢?
  • 分析双指针往中间靠拢比较的原理, 它是第一个和最后一个比较, 第二个和倒数第二个比较, 以此类推…
  • 所以我们可以人为将链表分成左右两半部分, 然后将右半部分进行反转, 再用双指针从两部分的头节点依次往后比较即可
  • 这样就把问题分解成了 3 个经典的小问题, 它们都可以利用双指针来解决, 大家可以结合下面的代码和注释进行理解
  • 如果题目要求恢复原来链表结构的话, 还可以将链表翻转部分提取出来, 然后比较完之后再将右半部分转回去, 下面代码也实现了这一步

复杂度

  • 时间复杂度 O(N): 只需要遍历每个节点三遍(划分/翻转/比较)
  • 空间复杂度 O(1): 只使用了几个常数空间的变量

代码

class Solution:
    def isPalindrome(self, head: ListNode) -> bool:
        # 把右半部分翻转后再双指针依次比较, 最后将输入链表结构恢复成原样
        # 第一步: 使用快慢指针找中点
        fast = head
        slow = head
        while fast:
            fast = fast.next
            if fast:
                fast = fast.next
            slow = slow.next
        # 此时slow就是右半部分的头节点(左半部分长度可能相等或多1, 对应总长度是偶数和奇数的情况)
        # 第二步: 定义翻转函数, 将右半部分进行翻转
        def reverse(cur):
            # 翻转并返回新的头
            pre = None
            while cur:
                nex = cur.next
                cur.next = pre
                pre, cur = cur, nex
            return pre

        # 第三步: 双指针依次比较左右两部分对应节点, 并记录右半部分末尾节点用于恢复原始结构
        left, right = head, reverse(slow)
        rightHead = right
        res = True
        # 注意右半部分长度<=左半部分, 所以一定是right先没
        while right:
            if left.val != right.val:
                res = False
                break
            left = left.next
            right = right.next
        # 翻转右半部分开头恢复原始链表结构(注意它可能不存在, 如果当原始链表长度小于等于1时)
        reverse(rightHead)
        return res

大家可以在下面这些地方找到我~😊

我的 GitHub

我的 Leetcode

我的 CSDN

我的知乎专栏

我的头条号

我的牛客网博客

我的公众号: 算法精选, 欢迎大家扫码关注~😊

算法精选 - 微信扫一扫关注我

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/550311.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ROS 开发环境搭建(虚拟机版本)(一)

相关工具&#xff0c;以及镜像&#xff08;以后有用&#xff09; 链接&#xff1a;https://pan.baidu.com/s/1xgtp-XGFFNCACV_-0TJO2A 提取码&#xff1a;ar1w 1. 下载vm虚拟机&#xff08;我选择的官方最新的vm虚拟机&#xff09;&#xff0c;安装好 2.安装百度网盘里面的…

办公智慧化风起云涌,华为MateBook X Pro 2023是最短距离

今年以来&#xff0c;我们几乎每个月&#xff0c;甚至每星期都可以看到大模型应用&#xff0c;在办公场景下推陈出新。 办公智慧化已成必然&#xff0c;大量智力工作正在被自动化。一个普遍共识是&#xff1a;AI能力范围之内的职业岌岌可危&#xff0c;AI 能力范围之外的职业欣…

【TES710D】基于复旦微的FMQL10S400全国产化ARM核心模块

板卡概述 TES710D是一款基于上海复旦微电子FMQL10S400的全国产化核心模块。该核心模块将复旦微的FMQL10S400&#xff08;兼容FMQL20S400&#xff09;的最小系统集成在了一个50*70mm的核心板上&#xff0c;可以作为一个核心模块&#xff0c;进行功能性扩展&#xff0c;特别是用…

第二章、认识用户体验五要素(本文作用是通俗讲解,让你更容易理解)

1.用户体验要素分五个层面&#xff0c;分别是战略层、范围层、结构层、框架层、表现层。 战略层&#xff1a;指的是产品所要解决的社会问题&#xff0c;和公司在这个产品上的收益目标。也就是大家所说的产品战略。 范围层&#xff1a;指的是我们要做的业务范围&#xff0c;我…

零基础学Java——基础part01

java基础第一篇 今日任务&#xff1a; 1、什么是软件开发 2、人机交互 3、常用的dos命令&#xff08;了解&#xff09; 4、什么是计算机语言 5、Java三种技术架构&#xff08;了解&#xff09; 6、Java语言特性&#xff08;跨平台原理) (了解&#xff09; 7、Java开发环境搭…

模拟运行600万年 数据0损坏!Solidigm把QLC闪存玩到了极致

不可否认的是&#xff0c;SLC、MLC、TLC、QLC、PLC、HLC……闪存技术一路走下来&#xff0c;整体的可靠性、寿命指标是逐步走低的&#xff0c;这也是NAND闪存架构天然属性所决定的。 当然&#xff0c;这不代表QLC、PLC闪存的就难堪大用&#xff0c;关键是看如何设计与优化&…

Carla自动驾驶仿真四:pygame渲染Camera画面及车辆控制(代码详解)

文章目录 前言一、依赖库安装1、pygame安装2、numpy安装 二、Pygame渲染Carla Camera画面1、连接Carla并初始化TrafficManager2、生成自动驾驶车辆并设置交通行为3、创建初始化pygame surface对象的函数4、创建pygame处理Carla图像的回调函数5、创建pygame键盘控制车辆运动的函…

软件设计师 试题二做题技巧

问题一&#xff1a;去需求分析中找相应的联系类型 问题二先看缺少的属性是不是er图中的实体&#xff0c;如果是实体文中就会有相关的信息&#xff0c;如果没有就对应的去图中找&#xff0c;转化为关系模式对应的联系也要转化为关系模式 如果是一对一就把联系归并到任意一方实…

JS 实现拖拽元素的功能

JS 实现拖拽元素的功能 这篇笔记比较短&#xff0c;主要过一遍 draggable 的事件。 首先简单看一下 HTML 实现&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Comp…

【小程序修改说明】分享朋友的,请忽略!

一、把js文件夹复制到根目录&#xff0c;跟pages同一目录 二、把下面的代码放到app.wxss最下面 代码 import "/js/font-awesome.wxss"; import "/js/font-awesome_small.wxss"; 三、ywym.wxml修改 1、ywym.wxml的最上边加上如下代码 <navigator url&…

【Linux】线程详解之线程控制

文章目录 POSIX线程库创建线程线程ID及进程地址空间布局线程等待pthread_join 线程终止pthread_exit函数pthread_cancel函数 线程分离理解pthread库 POSIX线程库 POSIX线程&#xff08;英语&#xff1a;POSIX Threads&#xff0c;常被缩写为Pthreads&#xff09;是POSIX的线程标…

若依源码解析:DataScopeAspect实现数据范围的控制

文章目录 源代码使用场景界面操作SysDeptServiceImplSysUserServiceImplSysUserMapperDataScope定义 代码解析Aspect和Component不同的数据权限类型Before通知处理数据范围的方法 源代码 Aspect Component public class DataScopeAspect {/*** 全部数据权限*/public static fi…

Python潮流周刊#2:Rust让Python再次伟大

△点击上方“Python猫”关注 &#xff0c;回复“1”领取电子书 这里记录每周值得分享的 Python 及通用技术内容&#xff0c;部分为英文&#xff0c;已在小标题注明。&#xff08;本期标题取自其中一则分享&#xff0c;不代表全部内容都是该主题&#xff0c;特此声明。&#xff…

【Linux Network】I/O多路转接之select

目录 1. 初识select 1.1 select函数原型 1.2 理解select执行过程 1.3 socket就绪条件 1.4 select的特点 1.5 select优缺点 2. 基于select的多人聊天程序 server源代码&#xff1a; client的登录&#xff1a; 结果演示&#xff1a; Linux Network&#x1f337; 1. 初识select 系…

C++初阶--C++入门之基础学习

0.前言 C是一门非常好的编程语言&#xff0c;但可能在学习C的过程中会遇到很多困难。人们常说 “一个人走得很快&#xff0c;一群人会走的更远”&#xff0c; 所以就让我们一起攻坚克难&#xff0c;一起征服C吧&#xff01;从本章开始&#xff0c;我们将开始C的基础学习&#x…

Linux简介及基础操作

1.Linux的作用&#xff1a; 商业服务器基本都是linux的、开源软件都先支持linux、大数据分析&#xff0c;机器学习首选linux、整个互联网地基基本由linux支撑起来。如&#xff1a; 生活中的手机是基于linux二次开发的&#xff0c;还有路由器也是基于linux开发的。 2.Linux是什…

acwing提高--多源BFS+最小步数模型+双端队列广搜

多源BFS 1.矩阵距离 题目https://www.acwing.com/problem/content/description/175/ #include<bits/stdc.h> using namespace std; #define x first #define y second typedef pair<int,int> PII; const int N1010; char g[N][N]; int dist[N][N]; PII q[N*N];…

【轻量化网络系列(2)】MobileNetV2论文超详细解读(翻译 +学习笔记+代码实现)

前言 上一篇我们介绍了MobileNetV1&#xff0c;主要是将普通Conv转换为dw和pw&#xff0c;但是在dw中训练出来可能会很多0&#xff0c;也就是depthwise部分得到卷积核会废掉&#xff0c;即卷积核参数大部分为0&#xff0c;因为权重数量可能过少&#xff0c;再加上Relu激活函数…

稳定币是个好生意

* * * 原创&#xff1a;刘教链 * * * 本月早些时候&#xff0c;市值第一的稳定币发行商Tether公布了其一季度的储备和盈利数据[1]。不能说是亮眼&#xff0c;只能说是非常亮眼。就看几个亮点吧&#xff1a; 1. 一季度净利润14.8亿美元&#xff0c;是2022年四季度的两倍多&…