Leetcode——141——Linked List Cycle【java】

keyword:快慢引用

比如:

fast:每次走两步

slow:每次走一步

如果链表有环,这俩货一定会相遇

【至于为什么】---跑步时候快的慢的一定会扣圈的啊

 假设Faster确实把Slower超了而且他俩还没相遇(类似Faster一下迈了2步,Slower一下迈了一步,Faster超了Slower,但是俩人并没遇上)。那么就假设Faster现在在 i+1 位置而Slower在 i 位置。那么前一时刻,Slower肯定是在 i-1 位置,而Faster肯定在(i+1)-2位置,所以前一时刻,俩人都在 i-1 位置,相遇了。

还有一种情况就是Faster在i+2位置而slower在i位置,那么前一时刻,Faster在i位置,而Slower在 i-1位置。这样问题又回归到上面那种情况了(再往前一时刻,Faster在i-2位置,Slower在i-1-1位置,相遇)。

所以,这就证明Runner和Faster在有环的链表中肯定会相遇。

以上来自http://www.bubuko.com/infodetail-270933.html

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public boolean hasCycle(ListNode head) {
       if (head == null) return false;
        
        ListNode slow = head, fast = head;
        while (fast.next != null && fast.next.next != null) {//这里保证了不会死循环····
            slow = slow.next;
            fast = fast.next.next;
            if (slow == fast) return true;
        }        
        return false;
        
    }
}
原文地址:https://www.cnblogs.com/Cherrylalala/p/6545234.html