分析过程:利用双指针
(1)在头节点处定义两个指针slow和fast
(2)fast一次移动两个节点,slow一次移动一个节点,如果slow指针与fast指针相遇说明链表中存在环。
无环的情况:
有环的情况:fast与slow在环内相遇
(3)相遇后的节点不一定是进入环的节点,我们将solw节点移到头节点,随后slow与fast节点每次向后移动一个节点,当fast与slow再次相遇的节点即为进入环的节点
执行代码:
/**
* @param {ListNode} head
* @return {ListNode}
*/
var detectCycle = function(head) {
if(!head||!head.next)return null;
let slow = head.next,fast = head.next.next;
while(fast && fast.next &&fast !== slow){
fast = fast.next.next;
slow = slow.next;
}
if(!fast||! fast.next)return null;
slow = head;
while(slow !== fast){
fast = fast.next;
slow = slow.next;
}
return slow;
};