234. 回文链表

news2024/11/14 20:53:10

1、题目描述在这里插入图片描述

额外要求:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

2、题解

2.1 解题思路1

使用额外的栈空间,先将链表中所有的元素依次压入栈中,得到链表的逆序,然后将栈中的元素依次弹出和链表中的元素从头到尾依次比较,如果发现不相等的元素,说明该链表不是回文链表,如果直到栈空,也没发现不相等的元素,那么该链表是回文链表。

public static boolean isHuiWen01(ListNode head) {
        if (head == null) {
            return true;
        }

        Stack<Integer> stack = new Stack<>();
        ListNode cur = head;

        while (cur != null) {
            stack.push(cur.val);
            cur = cur.next;
        }

        while (!stack.isEmpty()) {
            if (stack.pop() != head.val) {
                return false;
            }
            head = head.next;
        }

        return true;
    }

这种思路,时间复杂度O(N),空间复杂度O(N)。

2.2 解题思路2

思路2也是逆序比较的想法,通过观察可以得出,只需要将链表的后半部分元素逆序,然后和前半部分依次比较就可以得出链表是否是回文了。因此思路2和思路1的不同在于:

  1. 先找到链表的中点或者下中点,然后从中点(下中点)处依次将剩下的元素压入栈中。
  2. 依次弹出栈中元素和前半部分的链表元素依次比较,即可。
public static boolean isHuiWen02(ListNode head) {
        if (head == null) {
            return true;
        }

        ListNode fast = head;
        ListNode slow = head;

        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
        }

        Stack<Integer> stack = new Stack<>();
        while (slow != null) {
            stack.push(slow.val);
            slow = slow.next;
        }

        while (!stack.isEmpty()) {
            if (stack.pop() != head.val) {
                return false;
            }
            head = head.next;
        }

        return true;
    }

思路2的时间复杂度依然是O(N),空间复杂度也是O(N),但是系数是思路1的一半,减少了一半的栈空间。

2.3 解题思路3

思路3在思路2的基础上,去掉了栈,采用原地反转后半部分链表的思路,然后依次比较前半部分和后半部分的元素是否相等,具体来说:

  1. 首先找到链表的中点或者上中点mid,如何寻找链表中点可以参考这篇文章
  2. 然后将mid.next及后面的链表部分反转,同时将mid.next设置为null,这样单链表就变为了如下形式

1->2->3->4->null
1->2->null
4->3->null

  1. 依次遍历两个链表,如果在遍历过程中,发现了不等元素,说明链表不是回文,否则是回文
public static boolean isHuiWen03(ListNode head) {
        if (head == null) {
            return true;
        }

        ListNode fast = head;
        ListNode slow = head;

        while (fast.next != null && fast.next.next != null) {
            fast = fast.next.next;
            slow = slow.next;
        }

        // 此时slow来到中点或者上中点的位置
        ListNode slowPre = slow;
        slow = slow.next;
        slowPre.next = null;

        slow = reverse(slow);
        ListNode cur = slow;
        while (cur != null && head != null) {
            if (cur.val != head.val) {
                return false;
            }
            cur = cur.next;
            head = head.next;
        }

        slowPre.next = reverse(slow);
        return true;
    }

    private static ListNode reverse(ListNode head) {
        ListNode next = null;
        ListNode pre = null;

        while (head != null) {
            next = head.next;
            head.next = pre;
            pre = head;
            head = next;
        }

        return pre;
    }

这种时间复杂度是O(N),空间复杂度是O(1),因为是原地反转链表

3、提交结果

下面是最后一种的提交结果,当然可以选择最后不复原链表,时间会更好一些
在这里插入图片描述

4、相关链接

Leetcode-回文链表题目链接
链表中点定位相关技巧博客

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

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

相关文章

C++关于初始化列表的细节(必须/不能使用初始化列表的情况、初始化列表的效率分析)

必须使用初始化列表初始化的变量 const修饰的成员变量。 class A { public:A() { a 1; }int a; };构造函数内使用a 1初始化变量a&#xff0c;但这本质上是一种赋值&#xff0c;而我们都知道&#xff0c;const类型的变量是不允许赋值的。 没有默认构造函数的成员变量 所有变量…

百度安全在线查询提示风险原因分析与解决思路

很多站长看到自己的网站被百度提示&#xff1a;“百度网址安全中心提醒您&#xff1a;该页面可能存在违法信息”&#xff0c;这样的提示&#xff0c;都会惊讶自己网站昨天还好好的&#xff0c;怎么今天就提示这样的信息呢&#xff1f;在弄清楚这个问题之前&#xff0c;我们要知…

实时频谱仪的外部I、Q输出端口的同步扫描介绍

实时频谱分析仪与外部GPIO&#xff0c;I、Q输出端口等集成在一起。外部GPIO由外部触发功能组成&#xff0c;通过使用外部硬件和/或多个RTSA设备&#xff0c;可以实现同步扫描设置&#xff0c;以自动进行频谱扫描和捕获。同时&#xff0c;I、Q输出端口有助于与外部高速数字化仪集…

联合证券|日元疯狂跳水30000点!神秘无人机现身韩国萨德基地!

刚刚&#xff0c;又有大事发生&#xff01; 日本央行意外宣告保持收益率曲线忍受区间不变。日元忽然大暴跌&#xff0c;日元兑美元狂泻超三万点。韩国也有大音讯&#xff0c;据韩联社报导&#xff0c;1月17日&#xff0c;一架无人机挨近韩国“萨德”基地时被美军用搅扰枪击落&a…

2023跳槽最新面试题整理——JVM系列

今天是农历2022年腊月二十七了&#xff0c;和往常的春节假期、五一假期和十一假期一样都是团队中坚持到最后的一个。没几天也要快过年了&#xff0c;我先提前向大家拜个早年——祝大家兔年大吉&#xff0c;新春快乐&#xff0c;财源滚滚&#xff0c;万事如意。 今年从十一…

如何使用 Selenium 实现自动化操作?

目录 前言 一、关于Selenium 1.1、为什么选择它作为web自动化的测试工具&#xff1f; 1.2、Selenium操作浏览器的原理 二、实现一个简单的自动化 2.1、使用自动化操作浏览器 2.2、Selenium常用的API 2.2.1、查找页面元素 小结 前言 本篇咱们来谈谈Selenium自动化脚本是…

pfx证书转pem、crt、key

今天测试端的服务器突然不能下载苹果APP了&#xff0c;经查看&#xff0c;发现原来是测试环境的https证书过期了&#xff0c;需要更换证书&#xff0c;于是赶紧从阿里云更新我们的最新证书 我们程序部署在tomcat上&#xff0c;于是下载tomcat版本&#xff0c;下载完成后如下 我…

【微信小程序-原生开发】实用教程05-首页(含自定义调试模式、插入图片、图文排版、底部留白、添加本地图片)

开始前&#xff0c;请先完成启动/欢迎/首屏广告页的开发&#xff0c;详见 【微信小程序-原生开发】实用教程04-启动/欢迎/首屏广告页&#xff08;含倒计时、添加文字、rpx、定义变量和函数、读取变量、修改变量、wx.reLaunch 页面跳转、生命周期 onReady等) https://blog.csdn…

输入设备应用

1.输入设备其实就是能够产生输入事件的设备就称为输入设备&#xff0c; 常见的输入设备包括鼠标、键盘、触摸屏、按钮等等&#xff0c;它们都能够产生输入事件&#xff0c;产生输入数据给计算机系统。2.对于输入设备的应用编程其主要是获取输入设备上报的数据、 输入设备当前状…

驱动程序那点事儿

是什么 驱动程序是一个软件组件&#xff0c;&#xff08;添加到操作系统中的一小块代码&#xff09;&#xff0c;是操作系统和设备通信的桥梁。应用程序需要从设备中读取某些数据&#xff0c;操作系统会调用由驱动程序实现的函数。驱动程序了解如何与设备硬件通信以获取数据。当…

菜鸟程序员如何快速进阶成为编程老司机?

菜鸟程序员如何摆脱稚嫩&#xff0c;快速成长为一名资深码农&#xff1f; 以下这些事情&#xff0c;帮你快速打好基础。 如果你想成为更好的开发者&#xff0c;你应该尤其注意第10点和第14点。 1.积极大胆地谷歌。你得知道如何有效地组织搜索关键字&#xff0c;查阅别人写的…

高并发系统设计 --热点key问题解决

热点Key问题&#xff0c;这是一个老生常谈的问题了&#xff0c;今天我们来仔细的去剖析这个问题。 热点key带来的问题 流量集中。达到服务器处理上限&#xff08;CPU&#xff0c;网络IO等&#xff09;会影响在同一个Redis实例上其他key的读写请求操作热key请求落到同一个Redi…

【魅力开源】第7集:开源ERP系统Odoo发展史(Odoo中文社区野史2019版)

文章目录前言历程后记前言 开源 ERP 系统 Odoo 的发展史。 历程 2002 年比利时13 岁开 始学习编程序的 Fabien Pinckaers 所创建创办了Tiny Sprl 公司。Tiny Sprl 公司的第一个产品就是开发 Tiny ERP&#xff0c;即后来的 OpenERP&#xff0c;现在改名为Odoo。 2007 年 Ope…

Sklearn标准化和归一化方法汇总(3):范数归一化

Sklearn中与特征缩放有关的五个函数和类&#xff0c;全部位于sklearn.preprocessing包内。作为一个系列文章&#xff0c;我们将逐一讲解Sklearn中提供的标准化和归一化方法&#xff0c;以下是本系列已发布的文章列表&#xff1a; Sklearn标准化和归一化方法汇总(1)&#xff1a…

博云荣获证券基金信创联盟年度优秀成员

1月12日&#xff0c;证券基金行业信息技术应用创新联盟&#xff08;以下简称“联盟”&#xff09;2022年度峰会在上海顺利举行。会上&#xff0c;联盟为2022年积极参与联盟工作的成员单位进行了颁奖&#xff0c;博云获评信创联盟年度优秀成员奖。 联盟是在中国证券监督管理委员…

Spring | SM整合(Spring+MyBatis)

0️⃣使用工具编辑器&#xff1a;IDEA企业版构建系统&#xff1a;Maven数据库&#xff1a;MySQL1️⃣创建项目&#x1f38f;创建maven项目选择新建项目&#xff0c;在E盘下创建名为SMDemo的项目&#xff0c;构建系统选择Maven.&#x1f38f;项目结构src/main/java - java 逻辑代…

企业宣传新闻稿撰写方法和技巧分享,纯干货

企业宣传新闻稿重点在于“宣传”&#xff0c;目的性强&#xff0c;具有极强的商业价值&#xff0c;怎么撰写是一大难关。 企业新闻稿堪比公关小组&#xff0c;表面上看起来只是简简单单一篇新闻稿&#xff0c;但是实际上企业新闻稿也能起到大作用&#xff0c;企业新闻稿的价值…

Python Kafka客户端性能测试比较

前言 由于工作原因使用到了 Kafka&#xff0c;而现有的代码并不能满足性能需求&#xff0c;所以需要开发高效读写 Kafka 的工具&#xff0c;本文是一个 Python Kafka Client 的性能测试记录&#xff0c;通过本次测试&#xff0c;可以知道选用什么第三方库的性能最高&#xff0c…

umi4+antd5兼容360安全浏览器

项目场景&#xff1a; umi4创建的大屏项目&#xff0c;部分模块使用了antd5进行开发 问题描述 开发完成后&#xff0c;得知客户是360安全浏览器&#xff0c;内核为86&#xff0c;测试过程中出现了样式混乱。 混乱样式有下拉内容的组件&#xff08;如select、dataPicker&#…

Microsoft 365中的智能应用—翻译、朗读、听写

Microsoft 365 是一种订阅式的跨平台办公软件&#xff0c;基于云平台提供多种服务&#xff0c;通过将Word、Excel、PowerPoint和Outlook、OneNote等应用与OneDrive 和 Microsoft Teams等强大的云服务相结合&#xff0c;让任何人使用任何设备随时随地创建和共享内容。 Microsof…