剑指offer——25链表中环的入口节点

题目描述

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
 
题解:

  使用快慢指针即可,若快慢指针会相遇,则有环,否则快指针先到空节点;
  此时,快指针从此处一次移一步遍历,慢指针从头结点开始遍历,两指针再次相遇时即为环的重合节点;

 

 1 class Solution {
 2 public:
 3     ListNode* EntryNodeOfLoop(ListNode* pHead)
 4     {
 5         if (pHead == nullptr || pHead->next == nullptr)return nullptr;
 6         ListNode *slowPtr, *fastPtr;
 7         slowPtr = fastPtr = pHead;
 8         while (fastPtr != nullptr && fastPtr->next != nullptr)
 9         {
10             slowPtr = slowPtr->next;
11             fastPtr = fastPtr->next->next;
12             if (slowPtr == fastPtr)break;
13         } 
14         if (fastPtr != slowPtr)return nullptr;
15         slowPtr = pHead;
16         while (slowPtr!=fastPtr)
17         {
18             slowPtr = slowPtr->next;
19             fastPtr = fastPtr->next;
20         }
21         return fastPtr;
22     }
23 };

 

 

posted @ 2019-10-13 22:52  自由之翼Az  阅读(109)  评论(0编辑  收藏  举报