LeetCode 141、142环形链表
141题:
首先,先看141题,这个题是比较初级也是比较经典的环形链表题:
给定一个链表,判断链表中是否有环。
进阶:
你能否不使用额外空间解决此题?
那么,什么是有环的链表呢:
这个就是有环的链表
题设中说,能否不使用额外空间解决此题,说明,最普通的方法就是用其他的数据结构解决这个问题,那么我们想把链表结点依次遍历放入哈希表中,然后遇到重复的结点说明是有环的,这就是利用了其他的额外空间来解决这个问题,空间复杂度为O(n),现在我们直接说进阶的思路:
思路
如果,在环形的跑道上跑步的话,跑的快和跑的慢的人一直跑,会出现什么情况:
肯定是会相遇的,那么该题的解题思路就是:
龟兔赛跑法
快慢指针往前走,慢指针每次走1步,快指针每次走2步,如果是有环,快慢指针会相遇,否则永远不会相遇
空间复杂度:O(1),时间复杂度:O(n)
上代码:
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
/**
* 解题思路:龟兔赛跑法
* 快慢指针往前走,慢指针每次走1步,快指针每次走2步,如果是有环,快慢指针会相遇,否则永远不会相遇
* 空间复杂度:O(1),时间复杂度:O(n)
*/
public class Solution {
public boolean hasCycle(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while(slow != null && fast !=null && fast.next!=null){
slow = slow.next;
fast = fast.next.next;
if(slow == fast){
return true;
}
}
return false;
}
}
是不是觉得很神奇而且很简单呢,哈哈,接下来让我们看142第二题:
142题:
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
说明:不允许修改给定的链表。
进阶:
你是否可以不用额外空间解决此题?
入环的第一个节点?感觉没有什么头绪能够捕捉到这个节点,让我们多分析分析这个环形链表

设:
链表总长度: len
起点到入环的第一个节点的距离 : a 环起点到相遇点的距离:b 相遇点到环起点的距离:c
快节点绕环的圈数:k, 环的长度:r, 慢指针一共走的距离:s,慢指针一共走的距离:2s
则:
s + kr = 2s => s = kr 因为s = a + b; => a + b = kr
=>a + b = (k-1)r + r = (k - 1)r + len - a => a = (k - 1)r + len - a - b
=> a = (k-1)r + c
说明 从头结点和从相遇点以相同的速度向前移动,总会相交在环起点,如图所示,即从3点出发和从1点出发,速度一样的话,总会相遇在2点。
那我们将快节点指向head节点,然后一次走一步,慢结点不变,那么,他们相遇的地方就是环的头结点。
上代码:
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode detectCycle(ListNode head) {
if(head == null || head.next == null)
return null;
ListNode slow = head;
ListNode fast = head;
while(fast!=null&&fast.next!=null){
slow = slow.next;
fast = fast.next.next;
if(slow == fast){
break;
}
}
if(fast == slow){
fast = head;
while(fast!=slow){
fast = fast.next;
slow = slow.next;
}
return slow;
}else{
return null;
} }
}
是否感受到了算法的奇妙之美,哈哈,加油!
LeetCode 141、142环形链表的更多相关文章
- 【LeetCode】142. 环形链表 II
142. 环形链表 II 知识点:链表:set:快慢指针 题目描述 给定一个链表,判断链表中是否有环. 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表 ...
- [LeetCode题解]142. 环形链表 II | 快慢指针
解题思路 本题是在141. 环形链表基础上的拓展,如果存在环,要找出环的入口. 如何判断是否存在环,我们知道通过快慢指针,如果相遇就表示有环.那么如何找到入口呢? 如下图所示的链表: 当 fast 与 ...
- LeetCode 141:环形链表 Linked List Cycle
给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. Given a l ...
- leetcode题目142.环形链表Ⅱ(中等)
题目描述: 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 p ...
- Leetcode 141题 环形链表(Linked List Cycle) Java语言求解
题目描述: 给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. Map ...
- LeetCode 142. 环形链表 II(Linked List Cycle II)
142. 环形链表 II 142. Linked List Cycle II 题目描述 给定一个链表,返回链表开始入环的第一个节点.如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整 ...
- Java实现 LeetCode 142 环形链表 II(二)
142. 环形链表 II 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始 ...
- Leetcode 142.环形链表II
环形链表II 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 说明:不允许修改给定的链表. 进阶:你是否可以不用额外空间解决此题? 链表头是X,环的第一个节点是Y,sl ...
- 代码随想录第四天| 24. 两两交换链表中的节点 、19.删除链表的倒数第N个节点 、160.链表相交、142.环形链表II
今天链表致死量 第一题 public static class ListNode { int val; ListNode next; ListNode() {} ListNode(int val) { ...
随机推荐
- 2019中山纪念中学夏令营-Day20[JZOJ] T1旅游详解
2019中山纪念中学夏令营-Day20[JZOJ] 提高组B组 Team_B组 T1 旅游 Time Limits: 2000 ms Memory Limits: 262144 KB Descrip ...
- 前端之BOM,DOM
前戏 到目前为止,我们已经学过了JavaScript的一些简单的语法.但是这些简单的语法,并没有和浏览器有任何交互. 也就是我们还不能制作一些我们经常看到的网页的一些交互,我们需要继续学习BOM和DO ...
- 剑指offer-数组中只出现一次的数字-数组-python
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. # -*- coding:utf-8 -*- class Solution: # 返回[a, ...
- python 短信邮件
短信邮件 hashlib- md5:非对称加密,不可逆的,经常用于加密密码然后存储- 示例: ```python import hashlib # 创建hash对象,可以指定需要加密的字符串 ...
- 丑陋的 shell 来一遍
学习使人进步,好记性不如烂笔头 在线正则 在线正则 ^(.)(.).*?\2\1$ 正式开始总结 cat 反过来读取文件 tac file.txt nl --> number line 如 ca ...
- time:时间就是生命
golang中的time包是用来处理时间的. 1.时间的基本属性 package main import ( "fmt" "strings" "tim ...
- Java入门指南-04 顺序、分支、循环
顺序结构 从上至下,依次执行 if 语句在 Java 里,用 if 语句来实现“当满足 XXX 条件时,执行 YYY”这样的逻辑判断.例如,在使用共享单车时需要检查人的年纪.如果在 12 岁以下,则禁 ...
- lightinthebox程序bug zencart
1.清空旧产品分类,新增分类与产品,前台首页不显示中间栏,提示无产品:布局设置 -(Main Page - Opens with Category)首页显示某分类,把新增的某分类ID填上或者设为0即可 ...
- 【2017 北京集训 String 改编版】子串
题意 你有一个字符串,你需要支持两种操作: 1:在字符串的末尾插入一个字符 \(c\) 2:询问当前字符串的 \([l,r]\) 子串中的不同子串个数 为了加大难度,操作会被加密(强制在线). \(n ...
- uestc summer training #4 牛客第一场
A dp[i][j][k]可以n3地做 但是正解是找把问题转化为一个两点不相交路径 最终答案为C(n+m, n)2-C(n+m, m-1)C(n+m,n-1) B 把题目的矩阵看成无向图的邻接矩阵 这 ...