https://leetcode.com/problems/linked-list-cycle-ii/
給定一個(gè)鏈表,判斷是否有環(huán),并且返回環(huán)開始的那個(gè)ListNode
- 思路1
HashSet存下來每一個(gè)走過的路,一直遍歷,當(dāng)發(fā)現(xiàn)set中有,則表明有環(huán)
public ListNode detectCycle(ListNode head) {
Set<ListNode> se = new HashSet<ListNode>();
ListNode tmp = head;
se.add(tmp);
while (tmp != null && tmp.next != null) {
tmp = tmp.next;
if (se.contains(tmp)) {
return tmp;
}
se.add(tmp);
}
return null;
}
- 思路2
1.快慢指針,先確定有換
2.fast不變,把slow指針再?gòu)念^開始,fast和slow同時(shí)走,再相交的地方就是環(huán)的起點(diǎn)
ListNode slow = head, fast = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if (slow == fast) {
break;
}
}
if (fast == null || fast.next == null) {
return null;
}
slow = head;
while (slow != fast) {
slow = slow.next;
fast = fast.next;
}
return fast;
}