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 };

       

  • 相关阅读:
    1052 Linked List Sorting (25 分)
    1051 Pop Sequence (25 分)
    1050 String Subtraction (20 分)
    1049 Counting Ones (30 分)
    1048 Find Coins (25 分)
    1047 Student List for Course (25 分)
    1046 Shortest Distance (20 分)
    1045 Favorite Color Stripe (30 分)
    1044 Shopping in Mars (25 分)
    1055 The World's Richest (25 分)
  • 原文地址:https://www.cnblogs.com/wangxf2019/p/13930849.html
Copyright © 2011-2022 走看看