Day8--HOT100--160. 相交链表,206. 反转链表,234. 回文链表,876. 链表的中间结点

Day8–HOT100–160. 相交链表,206. 反转链表,234. 回文链表,876. 链表的中间结点

每日刷题系列。今天的题目是力扣HOT100题单。

链表题目。

160. 相交链表

思路【我】:

1,计算链表长度

2,令A为较短链(如果B是短链,交换链表指针p和长度len)

3,长链B先遍历gap个长度

4,开始遍历,返回第一个相等点,遍历结束还没有相等点,就是没有。

public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {// 思路:末端对齐,也就是长链先遍历gap个长度// 然后遍历,返回第一个相等点,遍历结束还没有相等点,就是没有。ListNode pa = new ListNode();ListNode pb = new ListNode();// 1,计算链表长度int lenA = 0;int lenB = 0;pa = headA;pb = headB;while (pa != null) {pa = pa.next;lenA++;}while (pb != null) {pb = pb.next;lenB++;}// 2,令A为较短链(如果B是短链,交换链表指针p和长度len)pa = headA;pb = headB;if (lenA > lenB) {int temp = lenA;lenA = lenB;lenB = temp;ListNode tem = pa;pa = pb;pb = tem;}// 3,长链B先遍历gap个长度int gap = lenB - lenA;while (gap-- > 0) {pb = pb.next;}// 4,开始遍历while (pa != null) {if (pa == pb) {return pa;}pa = pa.next;pb = pb.next;}return null;}
}

思路【@灵艾山茶府】:

p和q终会相等,要么在交点,要么都是null。

  • 假设A链条长度为x+z,B链表长度为y+z,其中z为相交后共同的长度。
    • 如果相交在交点,那么走过的路:p为x+z+y,q为y+z+x。
    • 如果相等在null,那么走过的路:p为x+y,q为y+x。(此时没有z)
class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode p = headA;ListNode q = headB;while (p != q) {p = p != null ? p.next : headB;q = q != null ? q.next : headA;}return p;}
}

206. 反转链表

思路【我】:

需要一个pre指针作为辅助,pre需要初始化为null不能为new ListNode(),因为这是反转后的尾巴,如果是new ListNode的话会多了一个节点。

  • 当指针p不为空的时候,遍历。
    • 需要temp缓存p.next,即下一个要反转的对象
    • 然后将p.next往前指向pre
    • pre指针到下一个对象,即p
    • p指针到下一个对象,即temp
  • 最后当p为null的时候,证明pre是原链表的结尾,返回pre
class Solution {public ListNode reverseList(ListNode head) {ListNode pre = null;ListNode p = head;while (p != null) {ListNode temp = p.next;p.next = pre;pre = p;p = temp;}return pre;}
}

234. 回文链表

思路【我】:

反转链表+中心扩散法。

1,算长度len

2,反转左半部分

3,p是左半部分最后一位,temp=p.next,也就是右半部分的第一位了,所以right指向它。(如果len为奇数,temp是中间位置,中间位置的元素不用管,所以指针right = temp.next)

4,开始遍历。p和right现在在中间,向两遍扩散,一旦不相等返回false

5,遍历后,全部相等,返回true

class Solution {public boolean isPalindrome(ListNode head) {// 思路:反转链表+中心扩散法// 找到中间位置mid,分成两半部分来处理// 左半部分,反转链表// 左指针从中间往左遍历,右指针从中间往右遍历// 1,算长度lenint len = 0;ListNode p = head;while (p != null) {p = p.next;len++;}if (len == 1) {return true;}// 2,反转前半部分ListNode pre = null;p = head;// 这个temp本来是可以在循环体内的临时变量,但是下面需要用到,所以在外部定义.ListNode temp = p.next;for (int i = 0; i < len / 2; i++) {temp = p.next;p.next = pre;pre = p;// 这个if是为了,让p留在左半部分的最后一位// p就是左半部分,反转后,链表的头if (i + 1 == len / 2) {break;}p = temp;}// 3,p是左半部分最后一位,temp=p.next,也就是右半部分的第一位了,所以right指向它ListNode right;if (len % 2 == 0) {right = temp;} else {// 如果len为奇数,temp是中间位置,中间位置的元素不用管,所以指针right指向下一个right = temp.next;}// 4,开始遍历。p和right现在在中间,向两遍扩散,一旦不相等返回falsewhile (p != null) {if (p.val != right.val) {return false;}p = p.next;right = right.next;}// 5,遍历后,全部相等,返回truereturn true;}
}

876. 链表的中间结点

加餐题目

传统做法,先第一遍遍历找到长度len,第二遍遍历到n/2的位置,判断奇偶数返回对应位置。和我上题的找中间节点的方法是一样的。

但是这道题目,看了题解之后,看到@灵艾山茶府还可以用快慢指针法。

思路【@灵艾山茶府】:

快慢指针法,快指针走的速度是慢指针的2倍,当快指针到n,慢指针就是在中间位置。

class Solution {public ListNode middleNode(ListNode head) {// 快慢指针法,快指针走的速度是慢指针的2倍,当快指针到n,慢指针就是在中间位置ListNode fast = head;ListNode slow = head;while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;}return slow;}
}

由此,234回文链表的做法,也可以直接调用反转链表的方法,和寻找链表中间点的方法:

class Solution {public boolean isPalindrome(ListNode head) {ListNode mid = middleNode(head);ListNode right = reverseList(mid);ListNode left = head;// right:从 mid 到结束// left :从开始到 midwhile (right != null) {if (left.val != right.val) {return false;}left = left.next;right = right.next;}return true;}// 876. 链表的中间结点private ListNode middleNode(ListNode head) {ListNode slow = head;ListNode fast = head;while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;}return slow;}// 206. 反转链表private ListNode reverseList(ListNode head) {ListNode pre = null;ListNode cur = head;while (cur != null) {ListNode nxt = cur.next;cur.next = pre;pre = cur;cur = nxt;}return pre;}
}

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

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

相关文章

Rust面试题及详细答案120道(58-65)-- 集合类型

《前后端面试题》专栏集合了前后端各个知识模块的面试题&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

Horse3D游戏引擎研发笔记(八):在QtOpenGL环境下,按需加载彩虹四边形的顶点属性 (Unity、Unreal Engine、Three.js与Godot)

在上一篇博客中&#xff0c;我们探讨了如何在QtOpenGL环境下使用改进的Uniform变量管理方式绘制多彩四边形。本文将延续这一主题&#xff0c;深入探讨如何在QtOpenGL环境下按需加载彩虹四边形的顶点属性。这一功能是Horse3D引擎渲染系统的重要组成部分&#xff0c;旨在实现灵活…

模块化设计+微米级精度,GelSight Modulus 触觉型3D轮廓仪深入检测“盲区”

当航空航天工程师在精密舱体中搜寻微米级缺陷&#xff0c;汽车检查员在车间复杂结构里排查隐患&#xff0c;能源领域创新者尝试突破检测边界时&#xff0c;深耕视触觉 3D 显微技术的企业——GelSight&#xff0c;正以全新研发的GelSight Modulus触觉型3D轮廓仪&#xff08;简称…

Pytorch安装详细步骤

第一步&#xff1a;检查显卡支持的的CUDA版本 1.打开NVIDIA控制面板 首先鼠标右击桌面-显示更多选项-NVIDIA控制面板-点击弹出界面右上角的(系统信息)-点击弹出界面的(组件) 2.查看驱动版本 打开系统信息 点击组件,查看 以观测到红色方框内的信息可以看到(NVIDIA CUDA 13.0.…

2025职场进阶:低门槛技能实用手册

每到年初&#xff0c;都会有人问&#xff1a;如果只能投入有限的时间与预算&#xff0c;先考哪一两本证书更划算&#xff1f;本文把近两年的岗位需求、学习可获得性与花费周期做了综合权衡&#xff0c;给出一个以“先提升通用能力&#xff0c;再叠加行业资质”为主线的组合方案…

SDC命令详解:使用set_timing_derate命令进行约束

相关阅读 SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482 目录 指定降额比例 指定降额对象列表/集合 指定沿 指定最大、最小条件 指定早、晚条件 指定路径的类型 指定降额类型 指定约束 指定增量 写在最后 由于制造…

C++语言程序设计——03 进制ASCII码

目录一、进制表示与转换&#xff08;一&#xff09;不同进制表示&#xff08;二&#xff09;进制转换方法二、ASCII 码&#xff08;一&#xff09;ASCII 码表&#xff08;二&#xff09;ASCII 码转换&#xff08;三&#xff09;大小写英文字母转换【总结&#xff1a;如何记忆AS…

AtCoder Beginner Contest 420-Toggle Maze

题目描述 有一个 H行 W 列的网格。用 (i,j) 表示位于第 i 行&#xff08;从上往下数&#xff09;第 j 列&#xff08;从左往右数&#xff09;的格子。每个格子的状态用字符 Ai,j表示&#xff0c;含义如下&#xff1a; . &#xff1a;空格子。 #’ &#xff1a;障碍格子。 S &am…

20、DMA----释放CPU压力,加快传输

1、DMA介绍DMA&#xff0c;全称为&#xff1a;Direct Memory Access&#xff0c;即直接存储器访问。DMA传输方式无需CPU直接控制传输&#xff0c;也没有中断处理方式那样保留现场和恢复现场的过程&#xff0c;通过硬件为RAM与I/O设备开辟一条直接传送数据的通路&#xff0c;能使…

深入OpenHarmony OTA硬核升级

技术背景 OpenHarmony OTA(Over-The-Air)升级子系统为设备提供了远程升级能力,通过统一的升级接口屏蔽底层芯片差异,支持轻量系统、小型系统和标准系统的全量升级、差分升级和变分区升级。 核心特性 跨系统支持:覆盖轻量系统(Hi3861)、小型系统(Hi3516DV300)、标准系…

华为iVS1800接入SVMSPro平台

华为iVS1800接入SVMSPro平台 ** 华为好望Huawei HolosensIVS1800智能视频云平台采用首款昇腾310加持的嵌入式系统智能微边缘&#xff0c;独俱普惠AI鸿力。一台融合存储、计算、检索功能&#xff0c;满足小型园区、社区、银行网点、超市等场景安防需求&#xff0c;小机大智。 …

《异形战机2》v2.0.4数字豪华版,3D横版射击再临,机体武器海量升级

[游戏名称]: 《异形战机2》v2.0.4数字豪华版 [软件大小]: 17.7 GB [软件大小]: 夸克网盘 | 百度网盘 游戏介绍 《异形战机&#xff1a;最终版2》续作震撼登场&#xff01;经典横版射击全面升级&#xff1a;3D 画面炫目、关卡与机体海量扩充&#xff0c;只为带来酣畅淋漓的灭…

Java 异常(Throwable)

1. Throwable Throwable: 所有异常和错误的根类。实现 Throwable 或其子类的对象才能被 throw 或 catch。 Error: 表示严重的系统级问题&#xff0c;通常不应该被捕获或处理&#xff0c;程序通常无法从中恢复。 Exception: 表示程序可以处理的问题。分为 运行时异常、 受检异常…

rocketmq常用命令

官方文档 https://rocketmq.apache.org/zh/docs/ https://rocketmq.apache.org/zh/docs/domainModel/02topic/ https://rocketmq.apache.org/zh/docs/4.x/deployment/02admintool 集群配置管理 https://mp.weixin.qq.com/s/688wNSwZPraGvAnr0K7hRw RocketMQ运维管理命令mqadm…

【C++详解】哈希表概念与实现 开放定址法和链地址法、处理哈希冲突、哈希函数介绍

文章目录一、unordered系列的使用unordered_set类的介绍unordered_set和set的使⽤差异unordered_map和map的使⽤差异unordered_xxx的哈希相关接⼝二、哈希表实现哈希概念直接定址法哈希冲突负载因⼦将关键字转为整数哈希函数除法散列法/除留余数法乘法散列法处理哈希冲突开放定…

电影感人文街拍摆摊纪实摄影后期Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色介绍电影感人文街拍摆摊纪实摄影后期 Lr 调色是一种专注于捕捉街头生活烟火气的摄影风格&#xff0c;通过 Lightroom 后期调色赋予画面电影般的叙事感和情感深度。这种风格以摆摊小贩、市井行人、街头场景为主体&#xff0c;强调真实、自然的生活瞬间。调色核心在于低饱和暖…

【数据分享】298个地级市人工智能企业数量(1990-2023)

数据介绍引言人工智能产业作为数字经济的核心驱动力&#xff0c;其发展规模与分布格局深刻反映区域科技创新活力与产业升级潜力。为助力相关研究&#xff0c;本文分享一份涵盖全国 298 个地级市 1990-2023 年的人工智能企业核心数据&#xff0c;包含人工智能企业存量和人工智能…

LeetCode 面试经典 150_双指针_验证回文串(25_125_C++_简单)(双指针)

LeetCode 面试经典 150_数组/字符串_验证回文串&#xff08;25_125_C_简单&#xff09;题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;双指针&#xff09;&#xff1a;代码实现代码实现&#xff08;思路一&#xff08;双…

无障碍辅助模块|Highcharts引领可访问数据可视化的交流

在现代数据可视化中&#xff0c;无障碍辅助技术已成为必不可少的一部分。对于视障人士或使用屏幕阅读器的用户来说&#xff0c;传统图表往往难以获取有效信息&#xff0c;而 Highcharts 在设计之初便充分考虑了无障碍体验。 Highcharts作为可访问数据可视化的倡导者&#xff0…

从0到1:数据库进阶之路,解锁SQL与架构的奥秘

目录一、SQL 基础启航1.1 SQL 基础语法1.2 SQL 进阶查询1.3 SQL 实战案例分析二、分库分表实战2.1 分库分表的背景与原理2.2 分库分表策略设计2.3 分布式 ID 生成2.4 数据迁移方案三、中间件实战3.1 中间件概述3.2 DBLE 中间件实战3.3 MyCat 中间件实战四、高可用架构搭建4.1 高…