142. 环形链表 II

简介: 142. 环形链表 II

正文


1 题目描述


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

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

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

示例 1:

7.png

输入: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
解释:链表中有一个环,其尾部连接到第一个节点。

8.png

示例 3:

输入:head = [1], pos = -1
输出:no cycle
解释:链表中没有环。

10.png

2.我的代码


/**
* Definition for singly-linked list.
* class ListNode {
*     int val;
*     ListNode next;
*     ListNode(int x) {
*         val = x;
*         next = null;
*     }
* }
*/
public class Solution {
   private Object NULL = new Object();
   public ListNode detectCycle(ListNode head) {
       Map<ListNode, Object> map = new HashMap<>();
       while (head != null) {
           Object o = map.get(head);
           if (null != o) {
               return head;
          }else {
               map.put(head,NULL);
               head=head.next;
          }
      }
       return null;
  }
}


3 其他人的解法


/**
* 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) {
     //双指针
     ListNode slow=head;
     ListNode fast=head;
     while(true){  //一直循环,若快慢指针相遇,则退出
       //判断是否为非环链表
       if(fast==null||fast.next==null){
           return null; //返回null
      }
       slow=slow.next;
       fast=fast.next.next;
       if(slow==fast){ //相遇,跳出循环
           break;
      }
    }
     ListNode mNode=head;
     while(mNode!=slow){ //使得第二次相遇,相遇即为入口
         mNode=mNode.next;
         slow=slow.next;
    }
     return mNode;
  }
}
相关文章
|
7月前
|
存储 C语言 索引
环形链表、环形链表 II、有效的括号​​​​​​​【LeetCode刷题日志】
环形链表、环形链表 II、有效的括号​​​​​​​【LeetCode刷题日志】
|
6月前
|
Java
环形数组链表(java)
环形数组链表(java)
|
2月前
【数据结构】环形、相交、回文、分割、合并、反转链表
【数据结构】环形、相交、回文、分割、合并、反转链表
30 0
|
5月前
【数据结构OJ题】环形链表
力扣题目——环形链表
43 3
【数据结构OJ题】环形链表
|
5月前
【数据结构OJ题】环形链表II
力扣题目——环形链表II
36 1
【数据结构OJ题】环形链表II
|
6月前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
65 2
|
5月前
|
Java 索引
力扣经典150题第五十六题:环形链表
力扣经典150题第五十六题:环形链表
36 0
|
7月前
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点.
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点
61 1
|
7月前
|
存储 算法 索引
【力扣刷题】只出现一次的数字、多数元素、环形链表 II、两数相加
【力扣刷题】只出现一次的数字、多数元素、环形链表 II、两数相加
55 1
|
6月前
|
Java
单向环形链表-约瑟夫问题(java)
单向环形链表-约瑟夫问题(java)