Linked List Cycle -- LeetCode

2014-11-24 10:54:36 ¡¤ ×÷Õß: ¡¤ ä¯ÀÀ: 0

ÕâµÀÌâÊÇcc150ÀïÃæµÄÌâÄ¿£¬ËãÊÇÁ´±íÀïÃæ±È½Ï¾­µäµÄÌâÄ¿¡£
ÎÒÃÇÏȽ²Ò»Ï±ȽÏÖ±½ÓÈÝÒ×Ïëµ½µÄ·½·¨£¬¾ÍÊÇÓÃÒ»¸öhashset£¬È»ºó°Ñɨ¹ýµÄ½áµã·ÅÈëhashsetÖУ¬Èç¹û³öÏÖÖØ¸´Ôò·µ»Øtrue¡£Ïë·¨±È½Ï¼òµ¥£¬Ò²ºÜºÃʵÏÖ£¬ÕâÀï¾Í²»·Å´úÂëÁË£¬ÓÐÐËȤµÄÅóÓÑ¿ÉÒÔдд¡£
ÏÂÃæÎÒÃÇÀ´¿¼ÂÇÈçºÎ²»ÓöîÍâ¿Õ¼äÀ´ÅжÏÊÇ·ñÓÐcycle£¬Óõ½µÄ·½·¨ºÜµäÐÍ£¬¾ÍÊÇÄÇÖÖwalker-runnerµÄ·½·¨£¬»ù±¾Ïë·¨¾ÍÊÇά»¤Á½¸öÖ¸Õ룬һ¸ö×ߵĿ죬һ¸ö×ßµÃÂý£¬µ±Ò»¸ö×ßµ½Á´±íβ»òÕßÁ½¸öÏà¼ûµÄʱºò£¬Äܵõ½Ä³¸öÏëÒªµÄ½áµã£¬±ÈÈçÏàÓöµã£¬ÖеãµÈµÈ¡£
½éÉÜÍê·½·¨£¬Ê£ÏµÄÖ÷Òª¾ÍÊÇÊýѧÁË£¬¼ÙÉèÁ½¸öÖ¸ÕëwalkerºÍrunner£¬walkerÒ»±¶ËÙÒÆ¶¯£¬runnerÁ½±¶ËÙÒÆ¶¯¡£ÓÐÒ»¸öÁ´±í£¬¼ÙÉèËûÔÚcycle¿ªÊ¼Ç°ÓÐa¸ö½áµã£¬cycle³¤¶ÈÊÇc£¬¶øÎÒÃÇÏàÓöµÄµãÔÚcycle¿ªÊ¼ºób¸ö½áµã¡£ÄÇôÏëÒªÁ½¸öÖ¸ÕëÏàÓö£¬Òâζ×ÅÒªÂú×ãÒÔÏÂÌõ¼þ£º(1) a+b+mc=s; (2) a+b+nc=2s; ÆäÖÐsÊÇÖ¸Õë×ß¹ýµÄ²½Êý£¬mºÍnÊÇÁ½¸ö³£Êý¡£ÕâÀïÃæ»¹ÓÐÒ»¸öÒþº¬µÄÌõ¼þ£¬¾ÍÊÇs±ØÐë´óÓÚµÈÓÚa£¬·ñÔò»¹Ã»×ßµ½cycleÀïÃæ£¬Á½¸öÖ¸Õë²»¿ÉÄÜÏàÓö¡£¼ÙÉèkÊÇ×îСµÄÕûÊýʹµÃa<=kc£¬Ò²¾ÍÊÇ˵(3) a<=kc<=a+c¡£½ÓÏÂÀ´ÎÒÃÇÈ¡m=0, n=kc£¬ÓÃ(2)-(1)¿ÉÒԵõ½s=kcÒÔ¼°a+b=kc¡£ÓÉ´ËÎÒÃÇ¿ÉÒÔÖªµÀ£¬Ö»ÒªÈ¡b=kc-a(ÓÉ(3)¿ÉÒÔÖªµÀb²»»á³¬¹ýc)£¬ÄÇô(1)ºÍ(2)±ã¿ÉÒÔͬʱÂú×㣬ʹµÃÁ½¸öÖ¸ÕëÏàÓöÔÚÀëcycleÆðʼµãbµÄ½áµãÉÏ¡£
ÒòΪs=kc<=a+c=n£¬ÆäÖÐnÊÇÁ´±íµÄ³¤¶È£¬ËùÒÔ×ß¹ýµÄ²½ÊýСÓÚµÈÓÚn£¬Ê±¼ä¸´ÔÓ¶ÈÊÇO(n)¡£²¢ÇÒ²»ÐèÒª¶îÍâ¿Õ¼ä£¬¿Õ¼ä¸´ÔÓ¶ÈO(1)¡£´úÂëÈçÏ£º
public boolean hasCycle(ListNode head) {
    if(head == null)
        return false;
    ListNode walker = head;
    ListNode runner = head;
    while(runner!=null && runner.next!=null)
    {
        walker = walker.next;
        runner = runner.next.next;
        if(walker == runner)
            return true;
    }
    return false;
}
ÕâµÀÌâÊÇÁ´±íÖбȽÏÓÐÒâ˼µÄÌâÄ¿£¬»ùÓÚÕâ¸ö·½·¨£¬ÎÒÃDz»½ö¿ÉÒÔÅжÏÁ´±íÖÐÓÐûÓÐcycle£¬»¹¿ÉÒÔÈ·¶¨cycleµÄλÖã¬ÓÐÐËȤµÄÅóÓÑ¿ÉÒÔ¿´¿´Linked List Cycle II¡£