题目
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
程序核心思想
- 第一种方法的思想非常简单。使用一个hashset,遍历每一个节点,如果其出现在hashset中,那么返回它,它就是环的入口节点。如果没出现,则添加到hashset中,直到遍历完所有的(null),则返回null。
- 第二种方法是一个结论,记住就好了。
准备两个指针,一个快指针一个慢指针,快指针一次走两步,慢指针一次走一步,如果快指针走到null了,直接返回false,否则快慢指针一定会在环上相遇。当快慢指针相遇时,快指针回到链表的头部,然后快指针从走两步变为走一步,则快慢指针一定会在环的入口节点处相遇。
Tips
hashset的方法.png代码
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
import java.util.HashSet;
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead)
{
HashSet<ListNode> hs = new HashSet<ListNode>();
while(pHead != null){
if(hs.contains(pHead)){
return pHead;
}else{
hs.add(pHead);
}
pHead = pHead.next;
}
return null;
}
}
//LeetCode
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode detectCycle(ListNode head) {
if(head == null) return null;
ListNode fast = head;
ListNode slow = head;
if(head.next != null && head.next.next != null){
slow = head.next;
fast = slow.next;
}else{
return null;
}
while(fast.next != null && fast.next.next != null){
if(fast == slow){
fast = head;
while(fast != slow){
slow = slow.next;
fast = fast.next;
}
return fast;
}else{
slow = slow.next;
fast = fast.next.next;
}
}
return null;
}
}
网友评论