链表-环形链表II

代码随想录-刷题笔记

142. 环形链表 II - 力扣(LeetCode)

内容:

本题更多是考验数学,数学感觉到位了,本题可以说毫无难度

如何证明是否有环: 两个指针一个快,一个慢,如果能遇到 ,一定有环!

令fast每次走两步, slow每次走一步.

二者相遇的时候, 有以下情况

链表-环形链表II_第1张图片

公式推导:

slow distance = x+ y

fast distance = 2 * slow = x + y + n*(y+z)

2x + 2y = x + y + n*(y+z)

x = (n-1) * y + n*z

令 n = 1

x = z

即可证明 - 从head出发一个节点, 走 x 步 那么fast和slow的相遇点的那个节点 , 走 z 步 , 刚好相遇 ,相遇点即为入环点~

代码:

/**
 * 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) {
            fast = fast.next.next;
            slow = slow.next;
            if(slow == fast) {
                ListNode index1 = fast;
                ListNode index2 = head;
                while(index1 != index2) {
                    index1 = index1.next;
                    index2 = index2.next;
                }
                return index1;
            }
        }
        return null;
    }
}

总结:

数学,很奇妙吧。简单的公式最后能推出一个很神奇的结论 . 

你可能感兴趣的:(链表,java,数据结构)