地球人估计都知道这道题的解法了;
1. 首先设计快慢指针,当存在快慢指针重合时,说明这个链表存在环,当快慢指针没有重合时,则不存在环;
2. 当链表存在环时,可以将慢指针置为head节点,然后快指针位置不动,然后以此进行遍历,当下次快慢指针再次重合时,就是环链表的入口地址;至于why, 自己画一下吧;
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
//判断一个链表是否有环以及找到环链表的入口
ListNode *slow = head;
ListNode *fast = head;
while(fast!=NULL && fast->next!=NULL){
slow = slow->next; //慢指针的移动操作
fast = fast->next->next; //快指针的移动操作;
//判断slow与fast是否相等,如果存在相等说明这个链表是环状链表
if(slow == fast){
//将慢指针从链表头开始,快指针从当前位置开始,当下次重合时候就是入口地址? 关于原因,自己可以画一下;
slow = head;
while(slow != fast){
slow = slow->next;
fast = fast->next;
}
return slow;
}
}
return NULL;
}
};
374

被折叠的 条评论
为什么被折叠?



