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