一、题目
二、分析
这个题目很有意思,最开始我也没有想到很好的解法,但是发现题目使用的双指针方法很有效,就是利用快慢指针的方法去判断是否存在环,如果存在则使用其判断具体位置,这个和删除倒数第几个节点的那道题目很类似。
具体题目可以看这个分析:
三、代码
/** * 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) { if(head == NULL || head->next == NULL ) return NULL; //检测是否有环 ListNode* fast=head; ListNode* slow=head; while(fast!=NULL && fast->next!=NULL){ fast= fast->next->next; slow= slow->next; if(fast==slow)break; } //如果为空,则说明无环 if(fast==NULL || fast->next==NULL){ return NULL; } //如果有环,则开始寻找环的位置 fast=head; while(fast != slow){ fast = fast->next; slow = slow->next; } return slow; } };