使用双指针(快慢指针)解决单链表问题 [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 };