zoukankan      html  css  js  c++  java
  • 使用双指针(快慢指针)解决单链表问题 [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 };

       

  • 相关阅读:
    Makefile 之 $(Q)
    LeetCode-50-Pow(x, n)
    LeetCode-49. Group Anagrams
    全排列问题全面解析
    LeetCode-47. Permutations II
    LeetCode-46. Permutations
    LeetCode-43. Multiply Strings
    LeetCode-40. Combination Sum II
    LeetCode-39. Combination Sum
    LeetCode-36. Valid Sudoku
  • 原文地址:https://www.cnblogs.com/wangxf2019/p/13930849.html
Copyright © 2011-2022 走看看