题解 | #链表中环的入口结点#
链表中环的入口结点
https://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4
思路:双指针,主要是两个问题,一是判断是否有环,二是找到环的入口
对应的操作是:快慢指针如果相遇了,就是有环
在第一步是的基础上,让快指针回到链表头,此后快指针每次加1,如果再次相遇,就是入口处。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
//判断是否有环
public ListNode hasCycle(ListNode pHead) {
if (pHead == null) {
return pHead;
}
ListNode fast = pHead;
ListNode slow = pHead;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if (fast == slow) {
return slow;
}
}
return null;
}
public ListNode EntryNodeOfLoop(ListNode pHead) {
//快慢指相遇就说明链表是有环的
//判断好有环之后,让快指针回到头开始遍历单步,这时候相遇点就在入口处了,数理逻辑
ListNode slow = hasCycle(pHead);
if (slow == null) {
return null;
}
ListNode fast = pHead;
while (fast != slow) {
fast = fast.next;
slow = slow.next;
}
return slow;
}
}
剑指offer刷题总结 文章被收录于专栏
本专栏是本人刷剑指offer的记录总结,也欢迎大家评论区留言讨论交流~
