141. Linked List Cycle(javascript)

Given a linked list, determine if it has a cycle in it.
判斷一個鏈表是否有環(huán)?

Follow up:
Can you solve it without using extra space?
最好不用額外的空間得出答案

解:

循環(huán)鏈表的特點是表中最后一個節(jié)點的指針域指向頭節(jié)點,整個鏈表形成一個環(huán)。
之前不理解為什么快慢指針會相遇,看了知乎馮昱堯的回答明白,答案如下:

這個問題你可以用數(shù)學(xué)歸納法來思考。首先,由于鏈表是個環(huán),所以相遇的過程可以看作是快指針從后邊追趕慢指針的過程。那么做如下思考:

  1. 快指針與慢指針之間差一步。此時繼續(xù)往后走,慢指針前進一步,快指針前進兩步,兩者相遇。
  2. 快指針與慢指針之間差兩步。此時唏噓往后走,慢指針前進一步,快指針前進兩步,兩者之間相差一步,轉(zhuǎn)化為第一種情況。
  3. 快指針與慢指針之間差N步。此時繼續(xù)往后走,慢指針前進一步,快指針前進兩步,兩者之間相差(N+1-2)-> N-1步。
    因此,此題得證。所以快指針必然與慢指針相遇。又因為快指針速度是慢指針的兩倍,所以相遇時必然只繞了一圈。

自己想了一個讓自己能想明白的例子:
假設(shè)有一個環(huán)形跑道,A 和 B 跑步, A 一分鐘跑完一圈,B 兩分鐘跑完一圈,那么在 A 跑完第二圈的時候 A 和 B 就會相遇;
如果是一條直直的跑道,A 和 B 就不可能相遇

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */

/**
 * @param {ListNode} head
 * @return {boolean}
 */
var hasCycle = function(head) {
    
var slow = head, fast = head;
     while(true){
         if(fast === null || fast.next === null){
             return false;
         }
         slow = slow.next;        
         fast = fast.next.next;
         if(slow === fast){
             return true;
         }
     }
    
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容