Tag:List
Difficulty:Medium
Problem
环形链表 II
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
不允许修改 链表。
Solution
与 141. Linked List Cycle 的区别是,这里不仅仅要判断有没有环,还要返回入环节点。还是用快慢指针。 快指针走两步,慢指针走一步,快指针走到空,说明无环返回null,快慢指针相遇,说明有环
如果有环,快指针回开头,慢指针在当前,一起走,两指针再次相遇即为入环节点
public ListNode detectCycle(ListNode head) {
if (head == null || head.next == null || head.next.next == null) {
return null;
}
ListNode slow = head.next, fast = head.next.next;
while (slow != fast) {
if (fast == null || fast.next == null || fast.next.next == null) {
return null; // 快指针走到null了,说明没有环
}
slow = slow.next;
fast = fast.next.next;
}
// 快慢指针相遇,快指针回开头,一起走
fast = head;
while (fast != slow) {
fast = fast.next;
slow = slow.next;
}
return slow;
}