判断一个链表是否有循环,如果有返回第一相遇节点,否则返回NULL。
解题思路也是前面的龟兔赛跑问题,只不过问题变成了找循环的第一个节点。
解题如下:
/**
* 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) {
ListNode oneStep = head;
ListNode twoStep = head;
boolean cycle = false;
while(oneStep != null && twoStep != null && twoStep.next != null){
oneStep = oneStep.next;
twoStep = twoStep.next.next;
if(oneStep == twoStep) {
cycle = true;
break;
}
}
if(!cycle) return null;
oneStep = head;
while(twoStep != oneStep){
oneStep = oneStep.next;
twoStep = twoStep.next;
}
return twoStep;
}
}

本文介绍了一种使用快慢指针的方法来判断链表是否存在循环,并找到循环开始的第一个节点。通过两个速度不同的指针遍历链表,如果存在循环则快慢指针最终会在循环内相遇。
1395

被折叠的 条评论
为什么被折叠?



