一. 问题描述

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

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

说明:不允许修改给定的链表。

示例 1:

输入:head = [3,2,0,-4], pos = 1

输出:tail connects to node index 1

解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

输入:head = [1,2], pos = 0

输出:tail connects to node index 0

解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

输入:head = [1], pos = -1

输出:no cycle

解释:链表中没有环。

进阶:

你是否可以不用额外空间解决此题?

二. 解题思路

解题思路:本题有两种解题思路分别是set表进行查询和双指针进行解题。

解题思路1:采用set表进行解题。

步骤一:依次访问链表,并将其存储在set表中,如果发现set表中包含所访问的链表说明该节点就是循环节点的头节点,如果访问到null都没有包含则返回null。

解题思路2:采用双指针进行求解。

步骤一:通过快慢指针,fast走两步,low走一步,如果存在循环链表的话,必定快指针在循环内与慢指针相遇。则通过数学公式我们可推到当相遇后从头节点tempfirst开始走和慢指针必定在环的第一个节点相遇(推导过程Leetcode上有)

步骤二:当tempfirst==first的时候输出first就是所需要的节点,当访问到null都没有时说明没有环,输出null

三. 执行结果

执行用时 :0 ms, 在所有 java 提交中击败了100.00%的用户

内存消耗 :37.6 MB, 在所有 java 提交中击败了56.49%的用户

四. Java代码

 public ListNode detectCycle(ListNode head) {
if(head==null||head.next==null) {
return null;
}
ListNode first=head;
ListNode second=head;
do{
first=first.next;
if(second.next!=null) {
second=second.next.next;
}else {
return null;
}
}while(!(first==second)&&!(second==null)) ;
if(first==second) {
ListNode tempFirst=head;
while(!(first==tempFirst)) {
first=first.next;
tempFirst=tempFirst.next;
}
return tempFirst;
}else {
return null;
}
}

第二种思路代码:

public class Solution {
public ListNode detectCycle(ListNode head) {
HashSet<ListNode> set=new HashSet<ListNode>();
if(head==null||head.next==null) {
return null;
}
while(!(head==null)&&!set.contains(head)) {
if(!set.contains(head)) {
set.add(head);
head=head.next;
}
}
if(set.contains(head))
{
return head;
}else {
return null;
}
}
}

第142题:环形链表II的更多相关文章

  1. Leetcode 142题 环形链表 II(Linked List Cycle II) Java语言求解

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

  2. LeetCode 142:环形链表 II Linked List Cycle II

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

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

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

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

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

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

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

  6. Leetcode 142.环形链表II

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

  7. 【算法训练营day4】LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表II

    [算法训练营day4]LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表 ...

  8. LeetCode142 环形链表 II

    给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 说明:不允许修改给定的链表. 进阶:你是否可以不用额外空间解决此题? //章节 - 链表 //二.双指针技巧 //2.环 ...

  9. 打败算法 —— 环形链表 II

    本文参考 出自LeetCode上的题库 -- 环形链表II,哈希表和快慢指针两种解法都需要O(n)的时间,但快慢指针仅占用O(1)的空间 https://leetcode-cn.com/problem ...

  10. Leetcode.142-Linked-list-cycle-ii(环形链表II)

    环形链表II 思路 https://www.cnblogs.com/springfor/p/3862125.html https://blog.csdn.net/u010292561/article/ ...

随机推荐

  1. setInterval定时器停止后,再重新启动

    1.数据自动滚动显示(动态添加) <li> <div class="FULeTi"> <div class="SLeName"&g ...

  2. AR*更新客户地址联系人

    CREATE OR REPLACE PACKAGE BODY cux_ar_party_location_pkg IS g_pkg_name CONSTANT VARCHAR2() := 'CUX_A ...

  3. 第一二章、C++简介和基本语法

    C++简介 C++包含了三种编程模式,分别是面向过程.面向对象和泛型编程. 程序执行过程 C++编程格式 C++每个程序都会有main()函数作为入口,基本编程包括预处理/头文件.函数.输入输出语句等 ...

  4. 宁夏网络赛-F-Moving On

    https://www.cnblogs.com/31415926535x/p/11440395.html 一道简单的Floyd题,,但是是动态加点求多次有限制的最短路,,感觉这个思想很好,,当然可以直 ...

  5. PHP提取中英文首字母的方法(首字母索引)

    function Getzimu($str) { $str= iconv("UTF-8","gb2312", $str);//如果程序是gbk的,此行就要注释掉 ...

  6. 【IDEA使用技巧】(5) —— IntelliJ IDEA集成Tomcat部署Maven Web项目

    1.IntelliJ IDEA集成Tomcat部署Maven Web项目 1.1.IDEA构建Maven Web项目 使用IDEA来创建一个简单的Hello World的Maven Web项目,并使用 ...

  7. python 获取mysql数据库列表以及用户权限

    一.需求分析 需要统计出当前数据库的所有数据库名,以及每个用户的授权信息. 获取所有数据库 在mysql里面,使用命令: show databases 就可以获取所有数据库了 获取所有用户 执行命令: ...

  8. Java线程设计模式(五)

    多线程的设计模式:Future模式.Master-Worker模式,生产消费者模式 public interface Data { String getRequest(); } public clas ...

  9. Linux用户管理的基本概念

    Linux系统如何区别不同的用户呢?可以很自然地想到,使用不同的用户名应该是一个好主意,就像真实世界中每个人都有名字一样.但“用户名”只是一种方便让人读的字符串,对机器来说是没有意义的.事实上,Lin ...

  10. SWD下载k60

    转:JTAG各类接口针脚定义,含义及SWD接线方式 IAR设置如下