Nowcoder java-链表中环的入口结点
(题目来自牛客网)
思路
左神讲的 先说个定理:两个指针一个fast、一个slow同时从一个链表的头部出发
fast一次走2步,slow一次走一步,如果该链表有环,两个指针必然在环内相遇
此时只需要把其中的一个指针重新指向链表头部,另一个不变(还在环内), 这次两个指针一次走一步,相遇的地方就是入口节点。
原理
代码
public class EntryNodeOfLoop {
public ListNode entryNodeOfLoop(ListNode pHead) {
if (pHead == null || pHead.next == null || pHead.next.next == null){
return null;
}
ListNode fast = pHead.next.next;
ListNode slow = pHead.next;
//先判断有没有环
while(fast != slow){
if (fast.next !=null && fast.next.next != null){
fast = fast.next.next;
slow = slow.next;
}else {
return null;
}
}
//循环出来的话就是有环,且此时fast==slow.
fast = pHead;//此时fast从头开始,slow从相遇点开始,当二者再次相遇时,就会在入环节点处相遇,返回fast或slow都可以。
while (fast!= slow){
fast = fast.next;
slow = slow.next;
}
return slow;
}
}