问题
样例
思路
妙!!!
算法
(链表,快慢指针扫描) O(n)
本题的做法比较巧妙。
用两个指针 first,second。first,second 分别从起点开始走,first每次走一步,second每次走两步。
如果过程中 second走到null,则说明不存在环。否则当 first和 second相遇后,
让 first返回起点,second待在原地不动,然后两个指针每次分别走一步,当相遇时,相遇点就是环的入口。
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *entryNodeOfLoop(struct ListNode *head) {
if(!head || !head->next) return NULL;
struct ListNode *first = head,*second = head;
while(first && second){
first = first->next;
second = second->next;
if(second) second = second->next;
else return NULL;
if(first == second){
first = head;
while(first != second){
first = first->next;
second = second->next;
}
return first;
}
}
return NULL;
}