题目:
给定一个有环链表,实现一个算法返回环路的开头节点。
有环链表的定义:在链表中某个节点的next元素指向在它前面出现过的节点,则表明该链表存在环路。
示例:
输入:head = [3,2,0,-4], pos = 1
输出:tail connects to node index 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||head.next == null) {
return null;
}
ListNode fast=head;
ListNode sow=head;
while(fast!=null&&fast.next!=null){
fast=fast.next.next;
sow=sow.next;
if(fast==sow){
break;
}
}
if(fast!=sow){
return null;
}
fast=head;
while(fast!=sow){
fast=fast.next;
sow=sow.next;
}
return fast;
}
}