使用双指针(快慢指针)解决单链表问题 [LeetCode] 142. Linked List Cycle II 单链表中的环之二

 概述:

       快慢指针一般都初始化指向链表的头结点 head,前进时快指针 fast 在前(一次走两步),

慢指针 slow 在后(一次走一步)。

1. 判断单链表是否有环,并找到环的入口节点。

分析:如果单链表没有环,一定是快指针先走到链表结尾停下,如果链表有环,快慢指针会

不停地走下去,这样判断是否有环就很容易了。下面重点找环的入口节点。

     思路:如果链表有环,快慢指针一定会相遇。第一次相遇时,慢指针走的距离就是环的长度,

且此时慢指针和环入口的距离等于链表头结点和环入口的距离。所以可以在第一次相遇之后停下,

将快指针重新指向头结点,并一次移动一步,快慢指针再继续往下走,再次相遇的节点就是环的

入口节点。

   分析:快慢指针第一次相遇时,快指针走的距离是慢指针的2倍,快指针比慢指针多走了一个环

的长度,所以慢指针走的距离就是一个环的长度。所以慢指针从当前位置走到环入口的距离和其

从头结点环入口的距离相等。

  具体代码实现如下:

    

 1 class Solution {
 2 public:
 3     ListNode *detectCycle(ListNode *head)
 4     {
 5           ListNode *fast =  head;
 6           ListNode *slow =  head;
 7           while(fast != NULL && fast->next != NULL)
 8           {
 9               slow = slow->next;//move one step
10               fast = fast->next->next;
11               if(slow == fast)// meet 
12               {
13                   slow = head;
14                   while(slow!=fast)
15                  {
16                     slow = slow->next;
17                     fast = fast->next;
18                  }
19                  return slow;
20               }
21           }
22           return NULL;
23     }
24 };

 

 

   

posted @ 2020-11-05 11:47  谁在写西加加  阅读(85)  评论(0编辑  收藏  举报