==========================努力奋斗财源广进==========================
给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。
import java.util.*;
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead) {
HashSet<ListNode> set = new HashSet<>();
while(pHead != null){
if(set.contains(pHead)){
return pHead;
}
set.add(pHead);
pHead = pHead.next;
}
return null;
}
}
public ListNode EntryNodeOfLoop(ListNode pHead) {
if(pHead == null) return null;
// 定义快慢指针
ListNode slow = pHead;
ListNode fast = pHead;
while(fast != null && fast.next != null){
// 快指针是满指针的两倍速度
fast = fast.next.next;
slow = slow.next;
// 记录快慢指针第一次相遇的结点
if(slow == fast) break;
}
// 若是快指针指向null,则不存在环
if(fast == null || fast.next == null) return null;
// 重新指向链表头部
fast = pHead;
// 与第一次相遇的结点相同速度出发,相遇结点为入口结点
while(fast != slow){
fast = fast.next;
slow = slow.next;
}
return fast;
}
本地的解法不算很好,时间复杂度为o(n),o(n)。借用hashset的特性,往里面添加元素,如果重复了也即是循环的入口点。
优秀解法是使用了快慢指针的解法
(1)首先判断是否包含的环,然后利用一个循环环的特性相遇的点。 【与第一次相遇的结点相同速度出发,相遇结点为入口结点】
评论区记录复习记录
评论