「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战」
题目:141. 环形链表
分析
如果不含有环,跑得快的那个指针最终会遇到null,说明链表没有环;如果含有环,快指针最终会超慢指针1圈,和慢指针相遇,说明链表有环。
function hasCycle(head) {
let fast = head;
let slow = head;
while(fast && fast.next) {
fast = fast.next.next;
slow = slow.next;
if(fast == slow) {
return true;
}
}
return false;
};
题目:142. 环形链表 II
分析
设相遇点于环的起点的距离为m,那么环的起点与头节点head的距离为k-m,也就是说从head前进k-m步就能到达环起点;巧的是,如果从相遇点继续前进k-m步,也恰好到达环起点;
function detectCycle(head) {
let fast = head;
let slow = head;
while(fast && fast.next) {
fast = fast.next.next;
slow = slow.next;
if(fast == slow) break;
}
// 上面的代码和判断是否有环相识
if(!fast || !fast.next) {
return null
}
fast = head;
while(fast != slow) {
// 两个指针以相同的速度前进
fast = fast.next;
slow = slow.next;
}
// 两个指针相遇的那个单链表节点就是环的起点
return fast;
}