题目描述
题目链接
给定一个链表,如果链表有环,返回链表环起始结点,否则返回null
思路分析
首先定义两个指针(快指针fast和慢指针slow),初始化为头结点head,当快指针追上慢指针的时候,让其中一个指针去指向头结点head,然后根据相遇点到链表环起始节点的距离是等于头结点到链表环起始节点的距离的,就可以找到链表环起始节点
代码实现
/**
* 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;
} else {
ListNode slow = head;
ListNode 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;
} else {
slow = head;
while (slow != fast) {
slow = slow.next;
fast = fast.next;
}
return slow;
}
}
}
}