Leetcode--Java--142. 环形链表 II

题目描述

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

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。
进阶:
使用 O(1) 空间解决此题?

样例描述

在这里插入图片描述

思路

双指针 + 数学推理证明

  1. 判断有无环的方法是,设置快慢指针,如果相遇,说明有环,如果快指针到达null且没有相遇,说明没有环。
  2. 环的入口为:设置另外2个指针,从快慢指针相遇结点,以及头结点开始,按同样步数走,相遇的位置就是环的入口,否则没有环。(数学证明推理过于复杂,此处不证明)
    在这里插入图片描述

代码

/**
 * 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 (fast != null && fast.next != null) {
    
    
           //快慢指针
           slow = slow.next;
           fast = fast.next.next;
           //相遇的话,记录相遇结点 (相遇说明一定有环,也就一定有环的入口)
           if (slow == fast) {
    
    
               ListNode node1 = fast;
               ListNode node2 = head;
               //寻找环的入口
               while (node1 != node2) {
    
    
                   node1 = node1.next;
                   node2 = node2.next;
               }
               return node2;
           }
       } 
       return null;    
    }
}

猜你喜欢

转载自blog.csdn.net/Sherlock_Obama/article/details/121095176