美文网首页
141. Linked List Cycle(javascrip

141. Linked List Cycle(javascrip

作者: f1a94e9a1ea7 | 来源:发表于2018-11-15 19:51 被阅读0次

Given a linked list, determine if it has a cycle in it.
判断一个链表是否有环?

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

解:

循环链表的特点是表中最后一个节点的指针域指向头节点,整个链表形成一个环。
之前不理解为什么快慢指针会相遇,看了知乎冯昱尧的回答明白,答案如下:

这个问题你可以用数学归纳法来思考。首先,由于链表是个环,所以相遇的过程可以看作是快指针从后边追赶慢指针的过程。那么做如下思考:

  1. 快指针与慢指针之间差一步。此时继续往后走,慢指针前进一步,快指针前进两步,两者相遇。
  2. 快指针与慢指针之间差两步。此时唏嘘往后走,慢指针前进一步,快指针前进两步,两者之间相差一步,转化为第一种情况。
  3. 快指针与慢指针之间差N步。此时继续往后走,慢指针前进一步,快指针前进两步,两者之间相差(N+1-2)-> N-1步。
    因此,此题得证。所以快指针必然与慢指针相遇。又因为快指针速度是慢指针的两倍,所以相遇时必然只绕了一圈。

自己想了一个让自己能想明白的例子:
假设有一个环形跑道,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;
         }
     }
    
};

相关文章

网友评论

      本文标题:141. Linked List Cycle(javascrip

      本文链接:https://www.haomeiwen.com/subject/focufqtx.html