快慢指针 01

95 阅读1分钟

LeetCode 141

leetcode-cn.com/problems/li…

快慢指针

快指针起始位置为头的下一个节点,慢指针起点在头位置,然后快指针每次跑两个节点,慢指针每次跑一个节点。

如果没环,快指针会先跑完整个链表,然后结束循环。

如果有环,快指针会先进入环中,并在环中一直转圈,慢指针迟早会进入环中,最终两指针一定会在环内节点相遇。

细节:
Q:为什么快慢指针的起点位置不都在头结点位置
A:因为判断有环的条件是两指针相遇,所以刚开始的时候它们不能在同一起点,但是可以用do-while来解决这个问题。

代码如下:

/**
 * 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 || head.next == null) return false;
        
        ListNode slow = head;
        ListNode fast = head.next;
		// 快指针的下一个位置有的走,则继续循环。
        while (fast != null && fast.next != null) {
            if (fast == slow) return true;
            slow = slow.next;
            fast = fast.next.next;
        }
        return false;
    }
}