141.如果链表中存在环,则返回 true 。 否则,返回 false
快慢指针
public class Solution {
public boolean hasCycle(ListNode head) {
ListNode fast=head;
ListNode slow=head;
while(fast!=null&&fast.next!=null){
fast=fast.next.next;slow=slow.next;
if(fast==slow){
return true;
}
}
return false;
}
}
142.环形链表 II
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
思路:快慢指针
设链表共有 a+b 个节点,其中 链表头部到链表入口 有 a 个节点(不计链表入口节点), 链表环 有 b 个节点(这里需要注意,a 和 b 是未知数)
双指针第一次相遇: 双指针都走过 a 步,然后在环内绕圈直到重合,重合时 fast 比 slow 多走 环的长度整数倍。
双指针第二次相遇:slow指针 位置不变 ,将fast指针重新 指向链表头部节点 ;slow和fast同时每轮向前走 1 步; 直到两指针重合,并同时指向链表环入口 。
题解
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode fast = head, slow = head;
while (true) {
if (fast == null || fast.next == null) return null;
fast = fast.next.next;
slow = slow.next;
if (fast == slow) break;
}
fast = head;
while (slow != fast) {
slow = slow.next;
fast = fast.next;
}
return fast;
}
}