返回
剑指 Offer 16:链表中环的入口节点
前端
2023-09-03 14:18:54
剑指 Offer 16:链表中环的入口节点
题目
给定一个链表,如果其中包含环,请找出该链表的环的入口结点,否则,输出null。
思路:
- 快慢指针法:使用快慢两个指针来遍历链表,快指针每次移动两步,慢指针每次移动一步。如果存在环,那么快慢指针最终会相遇。
- 相遇后,将慢指针从头开始重新遍历链表,快指针保持不变。当快慢指针再次相遇时,相遇的点就是环的入口结点。
代码:
public ListNode detectCycle(ListNode head) {
if (head == null || head.next == null) {
return null;
}
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if (slow == fast) {
break;
}
}
if (slow != fast) {
return null;
}
slow = head;
while (slow != fast) {
slow = slow.next;
fast = fast.next;
}
return slow;
}
时间复杂度:O(n),其中n是链表的长度。
空间复杂度:O(1)。
参考资料: