[Leetcode][第141、142题][JAVA][环形链表][哈希表][快慢指针][数学推理]
【问题描述】[中等]
【解答思路】
141
每次遍历到一个节点时,判断该节点此前是否被访问过。
具体地,我们可以使用哈希表来存储所有已经访问过的节点。每次我们到达一个节点,如果该节点已经存在于哈希表中,则说明该链表是环形链表,否则就将该节点加入哈希表中。重复这一过程,直到我们遍历完整个链表即可。
1. 哈希表
时间复杂度:O(N) 空间复杂度:O(N)
public class Solution {public boolean hasCycle(ListNode head) {Set<ListNode> seen = new HashSet<ListNode>();while (head != null) {if (!seen.add(head)) {return true;}head = head.next;}return false;}
}
2. 快慢指针
快指针走两步 慢指针走一步 如果有环 终有一天会追上
时间复杂度:O(N) 空间复杂度:O(1)
public boolean hasCycle(ListNode head) {ListNode slow = head;ListNode fast = head;while(fast!=null && fast.next!=null){slow=slow.next;fast=fast.next.next;if(slow==fast){return true;}}return false;}
142
1. 哈希表
时间复杂度:O(N) 空间复杂度:O(N)
public class Solution {public ListNode detectCycle(ListNode head) {ListNode pos = head;Set<ListNode> visited = new HashSet<ListNode>();while (pos != null) {if (visited.contains(pos)) {return pos;} else {visited.add(pos);}pos = pos.next;}return null;}
}
2. 快慢指针
时间复杂度:O(N) 空间复杂度:O(1)
public class Solution {//如果链表有环,请找到环的入口点
//fast一次走两步,slow一次走一步。所以,相遇的时候,fast所走的路程是slow所走的路程的两倍
//设起始位置到环入口点的距离为X,入口点到第一次相遇的位置的距离为L,C代表环的长度。
//slow和fast第一次相遇时,slow:X+L; fast:X+L+NC (N指代圈次)。
// 由上推出: 2(X+L) = X+L+NC -> X = NC - L;和圈数(环数)无关 -> X = C - L;
// 由上可得:当slow和fast第一次相遇时,把slow放到链表头部,与fast一起走,直到再次相遇,
// 那么这个相遇点就是环的入口点。//X = C - Lpublic ListNode detectCycle(ListNode head) {if(head == null || head.next ==null) return null;ListNode fast = head ;ListNode slow = head ;while(fast != null && fast.next != null) {slow =slow.next;fast = fast.next.next;if (fast == slow) {slow = head;while (fast != slow) {fast = fast.next;slow = slow.next;}return slow;}}return null;}}
【总结】
1. 环形链表思路 快慢指针 哈希表
2.快慢指针
链表常用技巧 快的走两步 慢的走一步
参考链接:
https://leetcode-cn.com/problems/linked-list-cycle-ii/solution/linked-list-cycle-ii-kuai-man-zhi-zhen-shuang-zhi-/
参考链接:
https://leetcode-cn.com/problems/linked-list-cycle/
[Leetcode][第141、142题][JAVA][环形链表][哈希表][快慢指针][数学推理]相关推荐
- 【LeetCode笔记】143. 重排链表(Java、链表、栈、快慢指针)
文章目录 题目描述 思路 & 代码 更新版:快慢指针 + 翻转链表 题目描述 一看题目反序:用栈 更新:O(1) 空间复杂度 思路 & 代码 先快慢指针,找到需要入栈的起点,然后逐个入 ...
- 牛客题霸 [ 环形链表的约瑟夫问题] C++题解/答案
牛客题霸 [ 环形链表的约瑟夫问题] C++题解/答案 题目描述 据说著名犹太历史学家 Josephus 有过以下故事:在罗马人占领乔塔帕特后,39 个犹太人与 Josephus 及他的朋友躲到一个洞 ...
- [Leetcode][第109题][JAVA][有序链表转换二叉搜索树][分治][快慢指针][中序遍历]
[问题描述][中等] [解答思路] 1. 分治 快慢指针 复杂度 class Solution {public TreeNode sortedListToBST(ListNode head) {ret ...
- java环形链表_数据结构和算法(四)Java实现环形链表
1. 数据结构和算法(四)Java实现环形链表 1.1 约瑟夫问题 约瑟夫问题:公元66年,约瑟夫不情愿地参与领导了犹太同胞反抗罗马统治的起义,后来起义失败,他和一些宁死不降的起义者被困于一个山洞之中 ...
- java 环形链表的示例
一.简介 环形链表是解决像约瑟夫环问题的类似问题的求解.这里并不讨论约瑟夫环问题,而是讨论环形链表的构建.环形链表由于头节点有数据域,并且又不是双向的,所以头节点需要单独处理. 对链表的编写,重点要测 ...
- 141. Linked List Cycle 环形链表
给定一个链表,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引 ...
- day07 Java链表(环、快慢指针)
转载注明!!https://blog.csdn.net/qq_31842777/article/details/90632307 涉及以下问题: 查找倒数第k个结点: 查找中间结点: 判断链表是否有环 ...
- LeetCode 457. 环形数组循环(暴力+快慢指针)
文章目录 1. 题目 2. 解题 2.1 暴力解题 2.2 快慢指针 1. 题目 给定一个含有正整数和负整数的环形数组 nums. 如果某个索引中的数 k 为正数,则向前移动 k 个索引.相反,如果是 ...
- LeetCode 136. Single Number【哈希表/位运算/数学】简单
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12.由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止:由于LeetCode还在不断地创建新 ...
最新文章
- activemq的部署(三)
- java 8 新功能详解_Java 8和Java 14之间的新功能
- sublime2使用和配置
- 二叉树的字符图形显示程序_每个程序员都必须知道的8种通用数据结构
- 从零开始学前端:列表标签 --- 今天你学习了吗?(CSS:Day06)
- LINUX下载编译libtheora
- 电视、家庭影院、音响、电影院、中高端声卡测试多声道测试样片
- win7计算机的蓝牙,手机蓝牙如何与win7电脑连接?win7电脑蓝牙连接手机的方法
- excel批量替换不同值(根据多个条件匹配、替换不成功的解决办法)
- 华硕ac68u最佳设置_【华硕RT-AC68U路由器使用总结】频段|设置|信号_摘要频道_什么值得买...
- python脚本1 - PPT导出为图片(WinLinux)
- 小周个人博客之恋爱日记
- ajax跨域数据不完整,Ajax交互,浏览器接收不到服务器的Json数据(跨域问题)
- UVA11540 Sultan's Chandelier
- putty上传下载文件到windows
- 十六款优秀任务管理软件,哪款适合您呢?
- 更改echarts中盒须图横坐标
- Codeforces——791A Bear and Big Brother
- Android开发日志打卡APP(一)
- 练习编程的过程中,运行时出现黑框一闪而过的解决方法
热门文章
- 文件查找_tar_ext34_swap
- 基于wordpress搭建网站和基于nodejs自己搭建
- 硬件描述语言复习笔记
- mysql数据到导入导出
- 1.怎样定制VC#DataGrid列标题?
- 09-Flutter移动电商实战-移动商城数据请求实战
- Android 倒计时——Timer和CountDownTimer的使用,实现启动,暂停,继续,重复,重设时长以及启动service后台倒计时
- 下拉框_教你封装 Element Tree 树状下拉框
- 经典算法题:字典树、并查集、单调栈、二分、带标记函数dp、树、全排列、字符串问题等常用算法
- 通用的MIME类型:application/octet-stream