【问题描述】[中等]


【解答思路】

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][环形链表][哈希表][快慢指针][数学推理]相关推荐

  1. 【LeetCode笔记】143. 重排链表(Java、链表、栈、快慢指针)

    文章目录 题目描述 思路 & 代码 更新版:快慢指针 + 翻转链表 题目描述 一看题目反序:用栈 更新:O(1) 空间复杂度 思路 & 代码 先快慢指针,找到需要入栈的起点,然后逐个入 ...

  2. 牛客题霸 [ 环形链表的约瑟夫问题] C++题解/答案

    牛客题霸 [ 环形链表的约瑟夫问题] C++题解/答案 题目描述 据说著名犹太历史学家 Josephus 有过以下故事:在罗马人占领乔塔帕特后,39 个犹太人与 Josephus 及他的朋友躲到一个洞 ...

  3. [Leetcode][第109题][JAVA][有序链表转换二叉搜索树][分治][快慢指针][中序遍历]

    [问题描述][中等] [解答思路] 1. 分治 快慢指针 复杂度 class Solution {public TreeNode sortedListToBST(ListNode head) {ret ...

  4. java环形链表_数据结构和算法(四)Java实现环形链表

    1. 数据结构和算法(四)Java实现环形链表 1.1 约瑟夫问题 约瑟夫问题:公元66年,约瑟夫不情愿地参与领导了犹太同胞反抗罗马统治的起义,后来起义失败,他和一些宁死不降的起义者被困于一个山洞之中 ...

  5. java 环形链表的示例

    一.简介 环形链表是解决像约瑟夫环问题的类似问题的求解.这里并不讨论约瑟夫环问题,而是讨论环形链表的构建.环形链表由于头节点有数据域,并且又不是双向的,所以头节点需要单独处理. 对链表的编写,重点要测 ...

  6. 141. Linked List Cycle 环形链表

    给定一个链表,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引 ...

  7. day07 Java链表(环、快慢指针)

    转载注明!!https://blog.csdn.net/qq_31842777/article/details/90632307 涉及以下问题: 查找倒数第k个结点: 查找中间结点: 判断链表是否有环 ...

  8. LeetCode 457. 环形数组循环(暴力+快慢指针)

    文章目录 1. 题目 2. 解题 2.1 暴力解题 2.2 快慢指针 1. 题目 给定一个含有正整数和负整数的环形数组 nums. 如果某个索引中的数 k 为正数,则向前移动 k 个索引.相反,如果是 ...

  9. LeetCode 136. Single Number【哈希表/位运算/数学】简单

    本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12.由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止:由于LeetCode还在不断地创建新 ...

最新文章

  1. activemq的部署(三)
  2. java 8 新功能详解_Java 8和Java 14之间的新功能
  3. sublime2使用和配置
  4. 二叉树的字符图形显示程序_每个程序员都必须知道的8种通用数据结构
  5. 从零开始学前端:列表标签 --- 今天你学习了吗?(CSS:Day06)
  6. LINUX下载编译libtheora
  7. 电视、家庭影院、音响、电影院、中高端声卡测试多声道测试样片
  8. win7计算机的蓝牙,手机蓝牙如何与win7电脑连接?win7电脑蓝牙连接手机的方法
  9. excel批量替换不同值(根据多个条件匹配、替换不成功的解决办法)
  10. 华硕ac68u最佳设置_【华硕RT-AC68U路由器使用总结】频段|设置|信号_摘要频道_什么值得买...
  11. python脚本1 - PPT导出为图片(WinLinux)
  12. 小周个人博客之恋爱日记
  13. ajax跨域数据不完整,Ajax交互,浏览器接收不到服务器的Json数据(跨域问题)
  14. UVA11540 Sultan's Chandelier
  15. putty上传下载文件到windows
  16. 十六款优秀任务管理软件,哪款适合您呢?
  17. 更改echarts中盒须图横坐标
  18. Codeforces——791A Bear and Big Brother
  19. Android开发日志打卡APP(一)
  20. 练习编程的过程中,运行时出现黑框一闪而过的解决方法

热门文章

  1. 文件查找_tar_ext34_swap
  2. 基于wordpress搭建网站和基于nodejs自己搭建
  3. 硬件描述语言复习笔记
  4. mysql数据到导入导出
  5. 1.怎样定制VC#DataGrid列标题?
  6. 09-Flutter移动电商实战-移动商城数据请求实战
  7. Android 倒计时——Timer和CountDownTimer的使用,实现启动,暂停,继续,重复,重设时长以及启动service后台倒计时
  8. 下拉框_教你封装 Element Tree 树状下拉框
  9. 经典算法题:字典树、并查集、单调栈、二分、带标记函数dp、树、全排列、字符串问题等常用算法
  10. 通用的MIME类型:application/octet-stream