[Leedcode][JAVA][第876题][快慢指针]
【问题描述】
给定一个带有头结点 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;}
}
【总结】
- 链表刷题需要牢记快慢指针
- 链表的查询效率低
- 链表题目打草稿很重要
[Leedcode][JAVA][第876题][快慢指针]相关推荐
- [Leedcode][JAVA][第105题][从前序与中序遍历序列构造二叉树][栈][递归][二叉树]
[问题描述][中等] 根据一棵树的前序遍历与中序遍历构造二叉树.注意: 你可以假设树中没有重复的元素.例如,给出前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = ...
- [Leedcode][JAVA][第470题][Ran7()实现Rand10()]
[问题描述][Leedcode][JAVA][第470题][Ran7()实现Rand10()] 已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 ...
- [Leedcode][JAVA][第45题][跳跃游戏 II][贪心算法]
[问题描述][Leedcode][JAVA][第45题][跳跃游戏 II] 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2.从下标为 0 跳到下标为 1 的位置 ...
- [Leedcode][JAVA][第287题][寻找重复数][HashSet][二分查找][快慢指针]
[问题描述][中等] 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数.假设只有一个重复的整数,找出这个重复的数.输入: ...
- LeetCode刷题——快慢指针
解题思路: 思路一: 模拟使用栈,当将要入栈的字符是"#"时,栈顶元素出栈(删除字符串中的元素).最后.比较两个字符串是否相同.这种解法并不是最优解,它的空间复杂度为:n + m ...
- [Leedcode][JAVA][第202题][快乐数]
[问题描述] 编写一个算法来判断一个数 n 是不是快乐数.「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终 ...
- 【LeetCode笔记】148. 排序链表(Java、归并排序、快慢指针、双重递归)
文章目录 题目描述 思路 & 代码 二刷 题目描述 难点在于时空复杂度的要求 思路 & 代码 转化成:归并排序 + 合并两个有序链表 即可 利用快慢指针来拆分成两条链表 注意:链表的拆 ...
- [Leedcode][JAVA][第680题][验证回文字符串Ⅱ][贪心][递归]
[问题描述][第680题][验证回文字符串Ⅱ][简单] 给定一个非空字符串 s,最多删除一个字符.判断是否能成为回文字符串.示例 1:输入: "aba" 输出: True 示例 2 ...
- [Leedcode][JAVA][第25题][K个一组反转链表][链表][递归]
[问题描述][第25题][K个一组反转链表][困难] 时间复杂度:O(N^2) 空间复杂度:O(1) ```java 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表.k 是一个正整数, ...
最新文章
- R语言ggplot2可视化增大图例字体实战
- C++ 中的引用 和指针的区别
- SpringBoot集成Google开源图片处理框架,贼好用!
- 计算机类自主招生推荐信,自主招生推荐信范文:中国人民大学自主招生推荐信...
- 一份好的商业计划书该怎么写
- STM32 vcap引脚
- Ubuntu20.04 搜狗输入法安装
- Code::Blocks下载及其汉化教程
- vue中如何使用h5自定义标签?
- 《哪吒》刷爆全网:不认命,就是我选择的命!做自己命运的主宰!
- 详解 n 维向量、n 维数组 和 矩阵的维度(转载)
- 什么是 make 和 makefile
- debian linux系统安装教程,Debian 10(Buster)安装过程图文详解
- 全闪存存储 NetApp AFF A 系列 ——引领闪存的未来发展
- 华为HarmonyOS鸿蒙2.0系统安装谷歌框架play商店GMS,mate30/40系列,p40,p50,nova5 6 7 8,荣耀30/40/50/magic3/9x
- 多投影-------边缘融合
- 华为OD机试 - 自动曝光(C 语言解题)【独家】
- Druid(Druid.io)简单使用
- poi从3.6 升级为新版本5.2.2,导致 原先的代码 报错,替换方案
- c 语言的输出函数cout,详解C++ cout格式化输出完全攻略