题目描述
对于一个给定的链表,返回环的入口节点,如果没有环,返回null
拓展:
你能给出不利用额外空间的解法么?
拙劣的画技
思路
设置快慢指针,都从链表头出发,快指针每次走两步,慢指针一次走一步,假如有环,一定相遇于环中某点
接着让两个指针分别从相遇点和链表头出发,两者都改为每次走一步,最终相遇于环入口。
两个结论:
1.设置快慢指针,假如有环,他们最后一定相遇在环中。
2.两个指针相遇后,让两个指针分别从链表头和相遇点重新出发,每次走一步,最后一定相遇于环入口。
代码
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode detectCycle(ListNode head) {
if(head == null) {
return head;
}
ListNode slow = head;
ListNode fast = head;
while( fast != null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
if(slow == fast){
slow = head;
break;
}
}
if(fast == null || fast.next == null){
return null;
}
while(slow != fast){
slow = slow.next;
fast = fast.next;
}
return slow;
}
}