每日一题-Day34-判断链表是否有环
题目
判断链表是否有环
解题思路
floyd判环算法:假设链表有环,使用fast和slow两个指针,fast每次移动是slow的n倍,slow每次移动一步,我们采用n=2来进行举例
- 令slow和fast指针开始移动,直至相遇(链表有环),此时slow移动了
s
步,fast移动了2s
步 - 将slow移动至链表起点,再次移动slow和fast指针,直至相遇,此时slow和fast在链表的环结点相遇,slow移动了
s+m
,fast移动了2s+m
- 推导结果参考
/*
* 返回环的首结点
*/
class Solution {
public ListNode findLoop(ListNode head) {
ListNode fast = head;
ListNode slow = head;
Boolean haveLoop = false;
if (head == null) {return 0};
while (slow.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;
if (slow == fast) {
haveLoop = true;
break;
}
if (haveLoop) {
fast = head;
while (slow != fast) {
slow = slow.next;
fast = fast.next;
}
return slow;
}
return null;
}
}
}