1. 程式人生 > 資訊 >京東 6.6 元:元気森林 × 元氣早餐椰汁 3.3 元探底(貓超次日達)

京東 6.6 元:元気森林 × 元氣早餐椰汁 3.3 元探底(貓超次日達)

做題思路 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 };