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),所以相遇的過程可以看作是快指針從后邊追趕慢指針的過程。那么做如下思考:
- 快指針與慢指針之間差一步。此時繼續(xù)往后走,慢指針前進一步,快指針前進兩步,兩者相遇。
- 快指針與慢指針之間差兩步。此時唏噓往后走,慢指針前進一步,快指針前進兩步,兩者之間相差一步,轉(zhuǎn)化為第一種情況。
- 快指針與慢指針之間差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;
}
}
};