题目描述
对于一个给定的链表,返回环的入口节点,如果没有环,返回null
拓展:
你能给出不利用额外空间的解法么?
有环链表入口问题
当快慢指针相遇时,我们可以判断到链表中有环(快慢指针相遇的时候),这时重新设定一个新指针指向量表的起点,且步长与慢指针一样为1.则慢指针与新指针相遇的地方就是环的入口。
则思路如下
- 判断链表是否有环,有环时快慢指针相遇
- 设定一个新的指针步长等于慢指针,当和慢指针再次相遇时此时的节点就是环的入口
/**
* 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 null;
ListNode slow = head;
ListNode fast = head;
while(fast != null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
//快慢指针相遇
if(slow.equals(fast)){
//设定新的指针
ListNode temp = head;
//新指针和慢指针再次相遇时的节点为入口节点
while(temp != slow){
if(temp.next != null){
temp = temp.next;
slow = slow.next;
}
}
return slow;
}
}
return null;
}
}