/
“给定一个链表,判断链表中是否有环。
进阶:
你能否不使用额外空间解决此题?”
/
/*
两人从同一起点同时出发,跑的快的人永远在跑的慢的人的前面,由s=vt可知两人之间的距离会随着时间的推移越来越大,只有一种情况例外,他们在绕圈跑。
反之也成立,绕圈跑就会出现速度快的人跑到速度慢的人的后面。
重点在于“圈”和“线”的区别,在指定了方向的情况下(单链表),区别于“线”,“圈”是没有绝对的先后的。
*/
思路:快慢指针,当快指针再次与慢指针重合时,返回true,当快指针到达NULL时,返回false。
class Solution
{
private:
ListNode * slow;
ListNode * fast;
public:
bool hasCycle(ListNode *head)
{
if(head==NULL)
return false;
if(head->next==NULL)
return false;
slow = head;
fast = head->next;
while (1)
{
for (int i = 0; i < 5; i++)
{
if (fast->next == NULL)
return false;
if (fast == slow)
return true;
fast = fast->next;
}
slow = slow->next;
}
}
};
唯一需要注意的点是for循环i值的设置,显然i值会影响到速度,i值过小,速度差就过小,想要追上就得花更长的时间;i值过大,就会在慢指针进圈之前进行不必要的循环,简单地测试了几下,最后选择了5,不一定是最快,可以接受。
思路应该是对的,但还有更好的写法。