Given a linked list, return the node where the cycle begins. If there is no cycle, return null
.
Follow up: Can you solve it without using extra space?
思考:第一步:设环长为len,快慢指针q、p相遇时,q比p多走了k*len。
第二部:p先走k*len步,p,q一起走每次一步,相遇时p比q多走了一个环距离,此时q就是环开始结点。
通过分析AC的感觉真好!
- class Solution {
- public:
- ListNode *detectCycle(ListNode *head) {
- // IMPORTANT: Please reset any member data you declared, as
- // the same Solution instance will be reused for each test case.
- if(!head||!head->next) return NULL;
- ListNode *p=head;int countP=0;
- ListNode *q=p->next;int countQ=1;
- bool flag=false;
- int len=0;
- while(q&&q->next)
- {
- if(p==q)
- {
- len=countQ-countP;
- flag=true;
- break;
- }
- else
- {
- q=q->next->next;
- p=p->next;
- countP+=1;
- countQ+=2;
- }
-
- }
- if(flag)
- {
- p=head;
- q=head;
- while(len--)
- {
- p=p->next;
- }
- while(p!=q)
- {
- p=p->next;
- q=q->next;
- }
- return p;
- }
- else return NULL;
- }
- };