题目描述
给定一个链表,若其中包含环,则输出环的入口节点。若其中不包含环,则输出null。
样例
给定如上所示的链表:
[1, 2, 3, 4, 5, 6]
2
注意,这里的2表示编号是2的节点,节点编号从0开始。所以编号是2的节点就是val等于3的节点。则输出环的入口节点3.
使用双指针,解法是定义一个慢指针first以及一个快指针second,慢指针走一步,快指针走两步,如果快指针都到了nullptr,则说明没有环,否则二者相遇之后,慢指针回到头结点,快指针不变,之后二者同时移动直到相遇,此时返回节点即可。做法证明
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *entryNodeOfLoop(ListNode *head) {
if(!head|| !head->next) return 0;
ListNode* first=head;
ListNode* second=head;
while(first&&second)
{
first=first->next;
second=second->next;
if(second)
{
second=second->next;
}
else return 0;
if(first==second)
{
first=head;
while(first!=second)
{
first=first->next;
second=second->next;
}
return first;
}
}
return 0;
}
};