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. 对C++类的继承和派生的理解

    C++中的继承是类与类之间的关系,是一个很简单很直观的概念,与现实世界中的继承类似,例如儿子继承父亲的财产. 1.继承(Inheritance)可以理解为一个类从另一个类获取成员变量和成员函数的过程. ...

  2. Mac 安装 Homebrew

    为什么要在 MAC 上安装 Homebrew 它干什么用的呢?我们知道在 CentOS 和 Ubuntu 上都有自己的包管理工具,但是在 MAC 上却没有这样类似的管理工具. # CentOS $ y ...

  3. LintCode 53---翻转字符串中的单词

    public class Solution { /* * @param s: A string * @return: A string */ public static String reverseW ...

  4. Caffe之prototxt

    1.可视化工具: http://ethereon.github.io/netscope/quickstart.html 2.常用网络模型caffe-model之.prototxt: https://g ...

  5. C语言字符串函数总结

    原文链接 函数名: stpcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source); 程序例: #include <s ...

  6. Alpha阶段评审

    组别  项目名称 学生互评 助教评分 点评建议 第1组 校园物资共享平台 7.97 6.17 界面较为简洁美观,实现物品信息发布,登录注册和个人信息等功能,交易功能待完善: 博客内容比较完善,有alp ...

  7. 一、PHP和Apache实现多用户自助建站

    一.环境搭建准备

  8. Linux查看系统开机和关机时间

    1.who 命令查看 who   -b    查看最后一次系统启动的时间 who   -r     查看当前系统运行时间   [root@test ~]# who -b          system ...

  9. yum 报错3

    . Contact the upstream for the repository and get them to fix the problem. . Reconfigure the baseurl ...

  10. 线程池ThreadPool

    在面向对象编程中,经常会面对创建对象和销毁对象的情况,如果不正确处理的话,在短时间内创建大量对象然后执行简单处理之后又要销毁这些刚刚建立的对象,这是一个非常消耗性能的低效行为,所以很多面向对象语言中在 ...