判断表中是否有环,若有环返回开始进入环的第一个节点
通过跑操场套圈的思想,设置两个指针fast每次走两格,slow每次走一格,
如果fast后来与slow相遇则说明有环,若fast的next是null则说明是无环。
此题只考虑套一圈的情况:
设进入环前走的路程是a,slow进入环后被追上时走的路程是b,环中slow还未走的路程是c(b+c是环的长度)
则fast追上slow时走的路程是:a+(b+c)+b , slow走的路程是:a+b
因为fast的速度是slow的两倍,得出→ 2*(a+b)=a+(b+c)+b 化简得 a = c的结论
根据a = c的结论,当fast和slow相遇后,设置一个指针cur从head出发,slow也继续走,当cur和slow相遇时,此时的结点就是入环的第一节点.
package p3.链式结构;
//判断表中是否有环,若有环返回开始进入环的第一个节点
/*
通过跑操场套圈的思想,设置两个指针fast每次走两格,slow每次走一格,
如果fast后来与slow相遇则说明有环,若fast的next是null则说明是无环。
此题只考虑套一圈的情况:
设进入环前走的路程是a,slow进入环后被追上时走的路程是b,环中slow还未走的路程是c(b+c是环的长度)
则fast追上slow时走的路程是:a+(b+c)+b slow走的路程是:a+b
因为fast的速度是slow的两倍,得出→ 2*(a+b)=a+(b+c)+b 化简得 a = c的结论
根据a = c的结论,当fast和slow相遇后,设置一个指针cur从head出发,slow也继续走,当cur和slow相遇时,此时的结点就是入环的第一节点
*/
public class Solution142 {
public ListNode detectCycle(ListNode head) {
if (head == null || head.next == null){
return null;
}
ListNode solw = head;
ListNode fast = head;
while (fast.next != null && fast.next.next != null){
solw = solw.next;
fast = fast.next.next;
if (solw == fast){
ListNode cur = head;
while (cur != solw){
cur = cur.next;
solw = solw.next;
}
return cur;
}
}
return null;
}
}