目录
题目描述
给你一个链表的头节点 head
,判断链表中是否有环并返回环的入口。
解法1.HashSet
class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; this.next = null; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
public ListNode hasCycle(ListNode head){
if(head==null){
return null;
}
HashSet set = new HashSet();
ListNode nest = head;
while(nest!=null){
if(set.contains(nest)){
return nest;
}
set.add(nest);
nest = nest.next;
}
return null;
}
解法2.快慢指针
class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; this.next = null; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
public ListNode hasCycle(ListNode head) {
if(head==null || head.next==null || head.next.next==null){
return null;
}
ListNode fast = head.next.next;
ListNode slow = head.next;
while(fast!=slow){
if(fast.next==null || fast.next.next==null){
return null;
}
fast = fast.next.next;
slow = slow.next;
}
fast = head;
while(fast!=slow){
fast = fast.next;
slow = slow.next;
}
return fast;
}