函式--呼叫函式
阿新 • • 發佈:2022-03-10
做題思路 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 classSolution { 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 };