iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 7
2
Software Development

LeetCode30系列 第 7

[LeetCode30] Day7 - 141. Linked List Cycle

  • 分享至 

  • xImage
  •  

題目

今天有一個 Linked list,給你linked list的head node,要判斷此Linked list是否有循環。
循環為true,不循環為false。

解析

這題跟昨天不快樂的人寫了快樂數字的解決方法是一樣! 所以今天介紹一下另外一個演算法
大家還記得昨天的龜兔賽跑演算法(Floyd Cycle Detection Algorithm)嗎? 兔子走比較快,烏龜走比較慢,兔子會慢慢追上烏龜而找到循環點和循環長度。
我畫的很辛苦,所以讓大家再欣賞一次。
https://ithelp.ithome.com.tw/upload/images/20200922/20129147fcVWeGlL4o.png

Brent's Algorithm

此想法和龜兔賽跑一樣,不一樣的地方在於我們的烏龜進化了!!!變成了忍者龜。
所以只有兔子會往前移動,但每一個移動週期,我們的烏龜會發動忍法,瞬間到兔子的旁邊,然後會把此週期變大。
當兔子移動到循環中,烏龜發動忍法也會進去循環,然後兔子會隨著移動週期變大,而追上烏龜!https://ithelp.ithome.com.tw/upload/images/20200922/20129147xhrVXyfihZ.png

Code

class Solution {
public:
    bool hasCycle(ListNode *head) {
        if(head==NULL){
            return false;
        }
        
        ListNode* rabbit = head->next;
        ListNode* turtle = head;
        
        int counter = 1, period = 1;

        while(rabbit != turtle){
            if(counter == period){
                turtle = rabbit; //烏龜發動忍法
                period *= 2;  //週期變大
                counter = 0;
            }
            if(rabbit==NULL){
                return false;
            }
            
            rabbit = rabbit->next; //兔子向前跑
            counter++; 
        }
        return true;
    }
};

https://ithelp.ithome.com.tw/upload/images/20200922/201291472uhOIoGO1R.png


上一篇
[LeetCode30] Day6 - 202. Happy Number
下一篇
[LeetCode30] Day8 - 1275. Find Winner on a Tic Tac Toe Game
系列文
LeetCode3030
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
EN
iT邦好手 1 級 ‧ 2020-09-22 14:16:54

推忍者龜

我要留言

立即登入留言