142. 环形链表 II
做题思路 or 感想 :
1,这一题用快慢指针来判断是否有环,快慢指针同一起点,速度不同,如果有环,则必定会相遇
2,第二个有意思的点就是数论环节来弄出环入口了,真的太精妙了,但因为我表述能力不好,这里就不谈了
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode *detectCycle(ListNode *head) { 12 ListNode* slow = head; 13 ListNode* fast = head; 14 if (head == nullptr)return nullptr; //防止奇怪测试用例 15 while (fast != nullptr && fast->next != nullptr) { //这里要注意! 16 //因为fast是走两下,所以要注意fast可能正好走到最后一个节点,也可能走过头到nullptr里了 17 fast = fast->next->next; 18 slow = slow->next; 19 if (fast == slow) { //因为快慢指针同一起点,速度不同,如果有环,则快的指针必定能追上慢指针,则证明有环 20 ListNode* temp = head; 21 while (temp != slow) { //这里就是数论环节了,说实话这里数论推导相当精妙 22 temp = temp->next; 23 slow = slow->next; 24 } 25 return slow; 26 } 27 } 28 return nullptr; 29 } 30 };

浙公网安备 33010602011771号