Ŀ¼
Á´½ÓÖ±´ï£º
ÌâÄ¿£º

Õý³£µÄµ¥Á´±íÿ¸ö½Úµã˳´ÎÁ´½Ó£¬×îºóÒ»¸ö½ÚµãÖ¸ÏòNULL£¬ÈçÏ£º

¶ø´ø»·Á´±íµÄ×îºóÒ»¸ö½Úµã²»ÔÙÖ¸ÏòNULLÁË£¬Ö¸ÏòµÄÊÇÇ°ÃæÈÎÒâÒ»¸ö½Úµã£¬ÒÔ´ËÐγɴø»·Á´±í£¬²¢Ò»Ö±Ñ»·ÏÂÈ¥¡£ÈçÏ£º

ÎÒÃÇ¿ÉÒÔ½«ÉÏÊöͼ»µÄ³éÏóÒ»µã£¬ÔÚûÓнøÈ뻷֮ǰÎÒÃÇÓÃÖ±Ïß±íʾ£¬½øÈë»·Ö®ºóÓÃȦÀ´±íʾ£¬ÒÔ´ËʾÒâÑ»·¡£´ËÌâÐèÒªÓõ½ÎÒÃÇ֮ǰ½²½âµÄÇóÖмä½ÚµãºÍÇóµ¹ÊýµÚk¸ö½ÚµãµÄ¿ìÂýÖ¸ÕëµÄ˼Ïë¡£¶¨ÒåÁ½¸öÖ¸ÕëslowºÍfast¾ùÖ¸ÏòÒ»¿ªÊ¼µÄλÖᣠÈÃslowÒ»´Î×ßÒ»²½£¬fastÒ»´Î×ßÁ½²½¡£

µ±slow×ßµ½Ö±ÏßÒ»°ëµÄλÖÃʱ£¬´ËʱµÄfast¸ÕºÃ¾ÍÔÚ»·µÄÈë¿Úµã¡£

¼ÙÉèslow¸ÕºÃ×ßµ½»·µÄÈë¿Úµãʱ£¬fast×ßµ½ÈçÏÂλÖ㬴Ëʱfast¿ªÊ¼×·¸Ïģʽ

fast¿ªÊ¼×·¸Ïslow£¬¼ÙÉèfastÔÚÈçϵÄλÖÿªÊ¼×·ÉÏslow

´úÂëÈçÏ£º
bool hasCycle(struct ListNode *head) {
struct ListNode*slow=head;
struct ListNode*fast=head;
while(fast&&fast->next)
{
slow=slow->next;
fast=fast->next->next;
if(slow==fast)
{
return true;
}
}
return false;
}
µ¥´¿´Ó½âÌåµÄ½Ç¶È¿´£¬´ËÌâ²¢²»¸´ÔÓ£¬½öÐèÓõ½¿ìÂýÖ¸ÕëµÄ˼Ïë¼´¿É½â¾ö£¬µ¥ÊÇÓÉ´ËÌâ¿ÉÒÔÒý³ö¶à¸öÖµµÃÎÒÃÇ̽ÌÖµÄÎÊÌ⣬ÒÔ´ËÀ´¼ÓÉîÎÒÃǶԻ·ÐÎÁ´±íµÄÈÏÖª£¬ÈçÏÂÈý´óÍØÕ¹ÎÊÌ⣺
´ð°¸£ºÒ»¶¨ÄÜ¡£
Ö¤Ã÷£º
µ±slow×ßµ½ÖмäµÄʱºò£¬fastÒ»¶¨½ø»·ÁË£¬´Ëʱfast¿ªÊ¼×·»÷¡£ÎÒÃǼÙÉèslow½ø»·ÒÔºó£¬slowºÍfastµÄ¾àÀëÊÇN£¬´Ëʱslow×ß1²½£¬fast×ß2²½£¬ËüÃÇÁ©µÄ¾àÀëËõ¶Ì1±äΪN-1¡£ÒÔ´ËÀàÍÆ£¬Ã¿´Î×·»÷£¬¾àÀëËõС1£¬µ±¾àÀëËõСΪ0ʱ¾Í×·ÉÏÁË¡£×ÛÉÏ£¬Ò»¶¨ÄÜ×·ÉÏ¡£

´ð°¸£º²»Ò»¶¨
Ö¤Ã÷£º
ÎÒÃÇÏÈÀ´ÌÖÂÛslowÒ»´Î×ß1²½£¬fastÒ»´Î×ß3²½µÄÇé¿ö¡£¼ÙÉèslow×ßÁË1²½£¬fast×ß3²½Ê±¸ÕºÃ½ø»·£¬¶øµ±slow¸ÕºÃ½ø»·µÄʱºò£¬fast¿ÉÄÜÒѾ×ßÁË1Ȧ£¬¾ßÌåÇé¿öµÃ¿´»·µÄ´óС£¬´ËʱslowºÍfastÖ®¼äµÄ¾àÀëΪN¡£²¢¼ÙÉè»·µÄ³¤¶ÈÊÇC¡£
slowÒ»´Î×ß1²½£¬fastÒ»´Î×ß3²½£¬¾àÀë±äΪN-2¡£Óɴ˿ɼû£¬fastºÍslowÿ×ßÒ»´Î£¬¾àÀëËõ¶Ì2¡£´Ëʱ¾Í²»ÄÑ·¢ÏÖÁË£¬ÐèÒª·ÖÀàÌÖÂÛ£¬µ±NÊÇżÊýʱ£¬¸ÕºÃ¿ÉÒÔ×·ÉÏ£¬µ±NÊÇÆæÊýʱ£¬×·µ½×îºó¾àÀëΪ-1£¬´Ëʱ¾ÍÒªÔÙ×·ÁË£¬Òâζ×ÅslowºÍfastÖ®¼äµÄ¾àÀë±ä³ÉC-1¡£
¼ÌÐø×·»÷£¬¸ù¾ÝÇ°ÃæµÄ·ÖÎö£¬Èç¹ûC-1ÊÇżÊý£¬ÄÇô¿ÉÒÔ×·ÉÏ¡£Èç¹ûC-1ÊÇÆæÊý£¬ÄÇô¾ÍÓÀÔ¶×·²»ÉÏÁË£¬½«»áÎÞÏßÑ»·×·ÏÂÈ¥£¬¿É¾ÍÊÇ×·²»ÉÏ¡£ËûÃǵIJî¾àNÊÇÓɽø»·Ç°µÄ³¤¶ÈºÍ»·µÄ³¤¶È¾ö¶¨µÄ£¬¶øÕâÁ½¸öÓÖ¶¼ÊÇËæ»úµÄ£¬ËùÒÔNµÄÖµ²»È·¶¨£¬¿ÉÆæ¿Éż£¬ÓÖÏñ¸Õ¸ÕÄÇÑùÌÖÂÛÏÂÈ¥£¬³öÏÖÆæÊý½«Ò»È¥²»¸´·µ¡£

ͬÀífastÒ»´Î×ß4²½Ò²ÊÇÕâÑùµÄÌÖÂÛ£¬Í¬Ñù¶¼ÊDz»Ò»¶¨£¬²»¹ýÕâ¸öʱºòÊÇÿ×ßÒ»´Î£¬¾àÀëËõ¶Ì3¡£µ±NÊÇ3µÄ±¶Êý¾Í¿ÉÒÔ×·ÉÏ£¬µ±²»ÊÇ3µÄ±¶Êý¾ÍÒª¼ÌÐøÌÖÂÛÁË£¬ÓÐÐËȤµÄͯЬ¿ÉÒÔ¼ÌÐø×êÑÐÏÂÈ¥£¬Ë¼ÏëºÍfastÒ»´Î×ß3²½Ò»Ñù£¬ÕâÀï²»¹ý¶à׸Êö¡£
µ±ÎÒÃǸãÇå³þslowºÍfast·Ö±ð×ߵľàÀëʱ£¬Èë¿Úµã×ÔÈ»¾ÍÃ÷ÁËÁË¡£
·¨Ò»£º

slowÒ»´Î×ß1²½£¬fastÒ»´Î×ß2²½£¬ÄÇôfast×ߵľàÀëÊÇslowµÄ2±¶
ÔÚ¾ßÌå½²½â֮ǰ£¬Ê×ÏÈÒª¸ãÇå³þ£¬²»´æÔÚ˵ÂýÖ¸ÕëslowÔÚÀïÍ·×ßÁËһȦ£¬¿ìÖ¸Õëfast»¹Ã»ÓÐ×·µ½slow£¬ÒòΪfastÿ´Î×ß2²½£¬slowÿ´Î×ß1²½£¬ËüÁ©¼äµÄ¾àÀëÿ´Î¶¼ËõС1£¬ËùÒÔÖ»»áÔ½À´Ô½½ü£¬Ö±µ½×·µ½¡£×î¶à×î¶àÒ²¾Í¿ì1Ȧ£¬µ«´ÓÀ´Ò²²»»á¸ÕºÃÂú1Ȧ¡£ËùÒÔÏÂÃæºÜÈÝÒ×ÍÆ³öslowºÍfast·Ö±ð×ßÁ˶àÉÙ¡£
¼ÙÉ裺
¡¾Á´±íÍ· - - - Èë¿Úµã¡¿£ºL
¡¾Èë¿Úµã - - - ÏàÓöµã¡¿£ºX
¡¾»·µÄ³¤¶È¡¿£ºC

slow×ߵľàÀ룺L + X
fast×ߵľàÀ룺L + N*C + X
½âÊÍ£º
ÒòΪÏÈǰÒѾÌáµ½slow²»»á¶¼×ßÁËһȦ»¹Ã»±»×·µ½£¬ËùÒÔºÜÈÝÒ×ÍÆ³öslowµÄ¾àÀë¾ÍÊÇL+X
¶ø¿ìÖ¸ÕëÒ»´Î×ß2²½£¬ºÜ¿ÉÄÜ»áÒòΪ»·¹ýСµ¼ÖÂÔÚslowÖ¸Õë½øÈëÈë¿Úµãǰ£¬fastÖ¸ÕëÒѾ×ßÁ˺ü¸È¦¡£¼ò¶øÑÔÖ®3¾ä»°£º
¸ù¾ÝÒ»¿ªÊ¼ËµµÄ£¬fast×ߵľàÀëÊÇslow×ߵľàÀëµÄ2±¶£¬¿ÉÁгöÈçÏÂʽ×Ó£º
2*(L+X) = L+ N*C + X
»¯¼òºó£ºL+X = N*C »ò L = N*C - X »ò L = (N-1)*C + (C-X) »ò L + X = N*C
Óô˹«Ê½¼´¿ÉÖ¤Ã÷£ºÒ»¸öÖ¸Õë´Ómeet×ߣ¬Ò»¸öÖ¸Õë´Óhead×ߣ¬ËûÃÇ»áÔÚÈë¿ÚµãÏàÓö£¡
ÒòΪʽ×Ó(N-1)*C±íÃ÷´ÓÏàÓöµã×ßÁËN-1ȦºóÓֻص½ÁËÏàÓöµã£¬´ËʱÔÙ×ßC-XµÄ¾àÀë¾Í»Øµ½ÁËÈë¿Úµã£¬ÓÉÉϵÃÖª£¬´Ë¹«Ê½È·ÊµÈÃËüÃǻص½ÁËÈë¿Úµã¡£
ÓÃÒ»µÀÇÐʵµÄÌâÄ¿À´¾ßÌå½â³öÈë¿ÚµãµÄλÖãº
Á´½ÓÖ±´ï£º
ÌâÄ¿£º

´úÂëÈçÏ£º
struct ListNode* detectCycle(struct ListNode* head) {
struct ListNode* slow = head;
struct ListNode* fast = head;
while (fast && fast->next)
{
//ÅжÏÊÇ·ñÊÇ´ø»·Á´±í
slow = slow->next;
fast = fast->next->next;
if (slow == fast)
{
struct ListNode* meet = slow;
while (meet != head)
{
//Çó³öÏàÓöµã
meet = meet->next;
head = head->next;
}
return meet;
}
}
return NULL;
}
ÇóÏàÓöµã»¹ÓÐÁíÍâÒ»ÖÖ·½·¨£º
ÕÒµ½ÏàÓöµãmeetºó£¬ÈÃmeet×ö⣬ÈÃÏÂÒ»¸öµã×öÐÂÁ´±íµÄÍ·

´Ë·¨ÏÔµÄÓÈΪÇÉÃ¸ÕºÃת»»³ÉÁËÁ½¸öÁ´±íÇó½»µãµÄÎÊÌâ¡£ÒòΪ´ËʱheadAÁ´±íµÄβ²¿ÊÇmeet£¬¶øheadBÁ´±íµÄβ²¿Ò²ÊÇmeet£¬´Ëʱ¾ÍÒâζ×ÅÁ©Á´±í±Ø»áÏཻ£¬¶øÏཻµÄµØ·½¾ÍÊÇÈë¿Úµã£¬Á½Á´±íÏཻÕýÊDz©Ö÷ÉÏÆª²©ÎÄÖÐËùÏêϸ½²½âµÄ£¬ÕâÀï¾Í²»¹ý¶àÇ¿µ÷ÁË¡£
µ½´ËÕâÆª¹ØÓÚCÓïÑÔ³¬Ïêϸ½²½âÊý¾Ý½á¹¹Öе¥Ïò»·ÐÎÁ´±íµÄÎÄÕ¾ͽéÉܵ½ÕâÁË,¸ü¶àÏà¹ØCÓïÑÔ µ¥Ïò»·ÐÎÁ´±íÄÚÈÝÇëËÑË÷Ô´ÂëËѲØÍøÒÔǰµÄÎÄÕ»ò¼ÌÐøä¯ÀÀÏÂÃæµÄÏà¹ØÎÄÕÂÏ£Íû´ó¼ÒÒÔºó¶à¶àÖ§³ÖÔ´ÂëËѲØÍø£¡
ÈÈÃÅÔ´Âë