142. 環形連結串列 II
阿新 • • 發佈:2018-12-05
給定一個連結串列,返回連結串列開始入環的第一個節點。 如果連結串列無環,則返回 null
。
說明:不允許修改給定的連結串列。
進階:
你是否可以不用額外空間解決此題?
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode *detectCycle(ListNode *head) { //思路1:用set,遍歷查詢重複的head。 set<ListNode*>node_set; while(head) { if(node_set.find(head) != node_set.end()) { return head; } node_set.insert(head); head = head->next; } return NULL; } };
//思路2:快慢指標,當slow==fast,則相遇 class Solution { public: ListNode *detectCycle(ListNode*head) { ListNode *fast = head; ListNode *slow = head; ListNode *meet = NULL;//相遇節點 while(fast) { slow = slow->next; fast = fast->next; if(fast == NULL) { return NULL; } fast = fast->next; //fast多走一步; if(slow == fast) { meet = fast; //相遇了 break; } } if(meet == NULL) { return NULL; } while(head && meet) { if(head == meet) { return meet; } head = head->next; meet = meet->next; } return NULL; } };