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环形链表的更多相关文章

  1. 【LeetCode】142. 环形链表 II

    142. 环形链表 II 知识点:链表:set:快慢指针 题目描述 给定一个链表,判断链表中是否有环. 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表 ...

  2. [LeetCode题解]142. 环形链表 II | 快慢指针

    解题思路 本题是在141. 环形链表基础上的拓展,如果存在环,要找出环的入口. 如何判断是否存在环,我们知道通过快慢指针,如果相遇就表示有环.那么如何找到入口呢? 如下图所示的链表: 当 fast 与 ...

  3. LeetCode 141:环形链表 Linked List Cycle

    给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. Given a l ...

  4. leetcode题目142.环形链表Ⅱ(中等)

    题目描述: 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 p ...

  5. Leetcode 141题 环形链表(Linked List Cycle) Java语言求解

    题目描述: 给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. Map ...

  6. LeetCode 142. 环形链表 II(Linked List Cycle II)

    142. 环形链表 II 142. Linked List Cycle II 题目描述 给定一个链表,返回链表开始入环的第一个节点.如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整 ...

  7. Java实现 LeetCode 142 环形链表 II(二)

    142. 环形链表 II 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始 ...

  8. Leetcode 142.环形链表II

    环形链表II 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 说明:不允许修改给定的链表. 进阶:你是否可以不用额外空间解决此题? 链表头是X,环的第一个节点是Y,sl ...

  9. 代码随想录第四天| 24. 两两交换链表中的节点 、19.删除链表的倒数第N个节点 、160.链表相交、142.环形链表II

    今天链表致死量 第一题 public static class ListNode { int val; ListNode next; ListNode() {} ListNode(int val) { ...

随机推荐

  1. Spring Boot 五种热部署方式,极速开发就是生产力!

    1.模板热部署 在 Spring Boot 中,模板引擎的页面默认是开启缓存的,如果修改了页面的内容,则刷新页面是得不到修改后的页面的,因此我们可以在application.properties中关闭 ...

  2. 初步了解autoencoder

    初步了解autoencoder 学习自莫烦python 什么是autoencoder? 自编码(autoencoder)是一种神经网络的形式. 例子:一张图片->对其进行打码->最后再将其 ...

  3. SVN服务器搭建与配置管理

    1.下载和搭建SVN服务器 现在Subversion已经迁移到Apache网站上了,下载地址:http://subversion.apache.org/packages.html,这是二进制文件包的下 ...

  4. python基础数据类型之一

    python属于解释型(有良好的平台兼容性,在任何环境中都可以运行,修改代码的时候直接修改就可以,可以快速部署,不用停机维护).动态的(python在编程之前不需要提前设定好各种变量,C语言之类的需要 ...

  5. Spring配置redis及使用

    一.redis简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库 Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用. ...

  6. FluentValidation在C# WPF中的应用

    原文:FluentValidation在C# WPF中的应用 一.简介 介绍FluentValidation的文章不少,零度编程的介绍我引用下:FluentValidation 是一个基于 .NET ...

  7. 109、Secret的使用场景 (Swarm16)

    参考https://www.cnblogs.com/CloudMan6/p/8082429.html   我们可以用secret管理任何敏感数据.这些敏感数据是容器在运行时需要的.同时我们又不想把这些 ...

  8. Hadoop学习之 HIVE 多用户模式安装

    一.启动hadoop 集群 1.启动zookeeper 集群   zkServer.sh start 2.在master.hadoop 机器上 ./start-all.sh 由于 start-all命 ...

  9. 08 nginx+uWSGI+django+virtualenv+supervisor发布web服务器

    一.为什么要用nginx,uwsgi? 1 首先nginx 是对外的服务接口,外部浏览器通过url访问nginx, 2nginx 接收到浏览器发送过来的http请求,将包进行解析,分析url,如果是静 ...

  10. css折叠表格

    1.html <div class="custom-fold-table"> <table cellpadding="0" cellspaci ...