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

LeetCode:链表的中间结点

1、题目描述

给你单链表的头结点 head ,请你找出并返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

示例 1:

输入:head = [1,2,3,4,5]
输出:[3,4,5]
解释:链表只有一个中间结点,值为 3 。

示例 2:

输入:head = [1,2,3,4,5,6]
输出:[4,5,6]
解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。

提示:

  • 链表的结点数范围是 [1, 100]

  • 1 <= Node.val <= 100

2、解题思路--快慢指针

使用快慢指针(Fast-Slow Pointer)来找到链表的中间节点:

  • 快指针(fast):每次移动 两步fast = fast.next.next)。

  • 慢指针(slow):每次移动 一步slow = slow.next)。

当快指针到达链表末尾时,慢指针正好指向链表的中间节点。

关键点
  1. 循环条件

    • while (fast != null && fast.next != null)

      • fast != null:确保快指针没有越界(适用于奇数长度链表)。

      • fast.next != null:确保快指针可以移动两步(适用于偶数长度链表)。

  2. 奇数长度链表

    • 链表长度为奇数时,快指针最终会指向最后一个节点fast.next == null),此时慢指针正好指向中间节点

    • 例如:1 -> 2 -> 3 -> 4 -> 5,慢指针指向 3

  3. 偶数长度链表

    • 链表长度为偶数时,快指针最终会指向 null(因为 fast.next.next 会越界),此时慢指针指向第二个中间节点(题目通常要求返回第二个中间节点)。

    • 例如:1 -> 2 -> 3 -> 4,慢指针指向 3(第二个中间节点)。

public static ListNode middleNode(ListNode head) {ListNode fast = head, slow = head;while (fast != null && fast.next != null) {fast = fast.next.next;  // 快指针每次走两步slow = slow.next;       // 慢指针每次走一步}return slow;  // 慢指针指向中间节点
}
时间复杂度
  • O(n),其中 n 是链表的长度。

  • 快指针遍历链表约 n/2 次,慢指针移动 n/2 次,因此总的时间复杂度是线性的。

http://www.xdnf.cn/news/4104.html

相关文章:

  • Linux的时间同步
  • HTTP/HTTPS协议(请求响应模型、状态码)
  • 1247: 彩色的棋子(chess)
  • 《Spring 中 @Autowired 注解详解》
  • 2023年408真题及答案
  • 读《人生道路的选择》有感
  • Day11 训练
  • 30天开发操作系统 第27天 -- LDT与库
  • Gateway网关:路由和鉴权
  • LeetCode 238:除自身以外数组的乘积(Java实现)
  • CRM客户关系管理系统高级版客户管理销售管理合同管理数据分析TP6.0框架源码
  • 阿里云服务器深度科普:技术架构与未来图景
  • kdump详解
  • 基于SRS实现流媒体服务器(最简单的流媒体服务器)
  • 【外围电路】0.介绍
  • react路由使用方法
  • 【ArUco boards】标定板检测
  • 《架构安全原则》解锁架构安全新密码
  • c++进阶——AVL树主要功能的模拟实现(附带旋转操作讲解)
  • ADK 第四篇 Runner 执行器
  • 把Android设备变成“国标摄像头”:GB28181移动终端实战接入指南
  • 博图V20编译报错:备不受支持,无法编译。请更改为受支持的设备。
  • C++初学者的入门指南
  • [Windows] 批量修改文件/文件夹时间戳工具 NewFileTime 7.71
  • VUE3报错 ReferenceError: Cannot access ‘openInit‘ before initialization
  • 【Qt】配置环境变量
  • educoder平台课-Python程序设计-8.文件
  • 价格识别策略思路
  • 第16章 监控和排除日志记录错误
  • 牛客 Wall Builder II 题解