Leetcode142,寻找环状链表入环点
Leetcode142
1、需求
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
。
2、解题思路
判断是否有环,可以使用Set集合,但是它是无序的,所以不能确定入环位置的下标,所以要使用快慢指针法。
如图示1所示,假设从起始点到入环点距离为a,当慢指针走到入环点的时候,快指针走了2a,(因为快指针走两步,慢指针走一步),假设从2a位置到入环点距离为x。
图示二所示,当x步后,快慢指针相遇,此时,相遇点与入环点距离为a。此时,声明第三个节点,位置在起始点,第三节点和慢指针每次走一步,a次之后,则在入环点相遇。
3、java代码
public ListNode detectCycle2(ListNode head) {
if(head == null){
return null;
}
ListNode fast = head.next.next;
ListNode slow = head;
while(slow != fast){
//如果fast = null代表fast和slow在一个节点,代表fast追上slow,则有环
//如果fast = null代表此链表没有环
if( fast == null || fast.next == null){
return null;
}
fast = fast.next.next;
slow = slow.next;
}
//程序运行到此,代表fast = slow
ListNode newNode = head;
while(slow != newNode){
newNode = newNode.next;
slow = slow.next;
}
return newNode;
}