【问题描述】

给定一个带有头结点 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
示例 1:
输入:[1,2,3,4,5]
输出:此列表中的结点 3 (序列化形式:[3,4,5])
返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
注意,我们返回了一个 ListNode 类型的对象 ans,这样:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.
示例 2:输入:[1,2,3,4,5,6]
输出:此列表中的结点 4 (序列化形式:[4,5,6])
由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。

【解答思路】

1.快慢指针 时间复杂度:O(N) 空间复杂度:O(1)
class Solution {public ListNode middleNode(ListNode head) {ListNode slow=head;ListNode fast=head;while(fast!= null && fast.next!=null){
//快指针q每次走2步,慢指针p每次走1步,当q走到末尾时p正好走到中间。slow=slow.next;fast = fast.next.next;}return slow;         }
}

​###### 2. 数组 时间复杂度:O(N) 空间复杂度:O(N)

class Solution {public ListNode middleNode(ListNode head) {ListNode[] A = new ListNode[100];int t = 0;while (head != null) {A[t++] = head;head = head.next;}return A[t / 2];}
}

​###### 3. 单指针法 时间复杂度:O(N) 空间复杂度:O(1)

class Solution {public ListNode middleNode(ListNode head) {int n = 0;ListNode cur = head;while (cur != null) {++n;cur = cur.next;}int k = 0;cur = head;while (k < n / 2) {++k;cur = cur.next;}return cur;}
}

【总结】

  1. 链表刷题需要牢记快慢指针
  2. 链表的查询效率低
  3. 链表题目打草稿很重要

[Leedcode][JAVA][第876题][快慢指针]相关推荐

  1. [Leedcode][JAVA][第105题][从前序与中序遍历序列构造二叉树][栈][递归][二叉树]

    [问题描述][中等] 根据一棵树的前序遍历与中序遍历构造二叉树.注意: 你可以假设树中没有重复的元素.例如,给出前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = ...

  2. [Leedcode][JAVA][第470题][Ran7()实现Rand10()]

    [问题描述][Leedcode][JAVA][第470题][Ran7()实现Rand10()] 已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 ...

  3. [Leedcode][JAVA][第45题][跳跃游戏 II][贪心算法]

    [问题描述][Leedcode][JAVA][第45题][跳跃游戏 II] 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2.从下标为 0 跳到下标为 1 的位置 ...

  4. [Leedcode][JAVA][第287题][寻找重复数][HashSet][二分查找][快慢指针]

    [问题描述][中等] 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数.假设只有一个重复的整数,找出这个重复的数.输入: ...

  5. LeetCode刷题——快慢指针

    解题思路: 思路一: 模拟使用栈,当将要入栈的字符是"#"时,栈顶元素出栈(删除字符串中的元素).最后.比较两个字符串是否相同.这种解法并不是最优解,它的空间复杂度为:n + m ...

  6. [Leedcode][JAVA][第202题][快乐数]

    [问题描述] 编写一个算法来判断一个数 n 是不是快乐数.「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终 ...

  7. 【LeetCode笔记】148. 排序链表(Java、归并排序、快慢指针、双重递归)

    文章目录 题目描述 思路 & 代码 二刷 题目描述 难点在于时空复杂度的要求 思路 & 代码 转化成:归并排序 + 合并两个有序链表 即可 利用快慢指针来拆分成两条链表 注意:链表的拆 ...

  8. [Leedcode][JAVA][第680题][验证回文字符串Ⅱ][贪心][递归]

    [问题描述][第680题][验证回文字符串Ⅱ][简单] 给定一个非空字符串 s,最多删除一个字符.判断是否能成为回文字符串.示例 1:输入: "aba" 输出: True 示例 2 ...

  9. [Leedcode][JAVA][第25题][K个一组反转链表][链表][递归]

    [问题描述][第25题][K个一组反转链表][困难] 时间复杂度:O(N^2) 空间复杂度:O(1) ```java 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表.k 是一个正整数, ...

最新文章

  1. R语言ggplot2可视化增大图例字体实战
  2. C++ 中的引用 和指针的区别
  3. SpringBoot集成Google开源图片处理框架,贼好用!
  4. 计算机类自主招生推荐信,自主招生推荐信范文:中国人民大学自主招生推荐信...
  5. 一份好的商业计划书该怎么写
  6. STM32 vcap引脚
  7. Ubuntu20.04 搜狗输入法安装
  8. Code::Blocks下载及其汉化教程
  9. vue中如何使用h5自定义标签?
  10. 《哪吒》刷爆全网:不认命,就是我选择的命!做自己命运的主宰!
  11. 详解 n 维向量、n 维数组 和 矩阵的维度(转载)
  12. 什么是 make 和 makefile
  13. debian linux系统安装教程,Debian 10(Buster)安装过程图文详解
  14. 全闪存存储 NetApp AFF A 系列 ——引领闪存的未来发展
  15. 华为HarmonyOS鸿蒙2.0系统安装谷歌框架play商店GMS,mate30/40系列,p40,p50,nova5 6 7 8,荣耀30/40/50/magic3/9x
  16. 多投影-------边缘融合
  17. 华为OD机试 - 自动曝光(C 语言解题)【独家】
  18. Druid(Druid.io)简单使用
  19. poi从3.6 升级为新版本5.2.2,导致 原先的代码 报错,替换方案
  20. c 语言的输出函数cout,详解C++ cout格式化输出完全攻略

热门文章

  1. 360发布穿戴设备“儿童卫士”手环
  2. 【观点】从曾成杰案看民间金融的高风险与银行缺失的机制创新
  3. 给数据库字段增加前缀
  4. Android 使用mqtt实例,包括接收服务器推送以及上传数据到服务器
  5. Android list转xml
  6. mpvue 小程序下拉刷新 三个点那种
  7. 小程序 地图 开发 组件 覆盖物
  8. oracle监听无法启动常用解决办法
  9. sqlserver 2008安装总是弹出重启提示
  10. TortoiseGit 客户端安装及使用