Given a linked list, return the node where the cycle begins. If there is no cycle, return null
.
时间复杂度为O(n)的链表环检测算法为快慢指针算法。当快慢指针相遇时,则意味着存在一个环。在检测到快慢指针指向同一节点后,将其中一个指针指向启示节点,然后将两个指针同时向后移动,两个指针再次相遇的地方就是环起始的地方。给个原理的解释:点击查看
AC代码:
ListNode* hasCycle(ListNode *head) { ListNode* meet = NULL; if(!head || !head->next) return NULL; ListNode *p1= head; ListNode *p2= head; while(p2) { if(!p2->next || !p2->next->next) return NULL; p2=p2->next->next; p1=p1->next; if(p1==p2) { meet =p1; return meet; } } return NULL; } ListNode *detectCycle(ListNode *head) { ListNode* met=hasCycle(head); if(!met) { cout<<"Has no circle!"<<endl; return NULL; } //hasCycle and met!=NULL ListNode *h=head; while(h!=met) { h=h->next; met=met->next; } return h; }
也是感觉复杂,继续修改:
ListNode *detectCycle(ListNode *head) { ListNode* p1= head ,*p2= head; do{ if((p2==NULL)||(p2->next == NULL)) return NULL; p2 = p2->next->next; p1 = p1->next; }while(p1!=p2); for(p1=head;p1!=p2;p1= p1->next,p2=p2->next) ; return p1; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步