题目:
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
思路:
思路1:创建一个链表用于按扫描的顺序保存节点,直到下一个节点在list中已经存在,那就说明该节点就是入口节点
思路2:规律求解
创建两个指针p1、p2,其中p1的步长为1,p2的步长为2。让两个指针从头结点开始往后走,如果有环的话,两个指针一定会相遇。
程序:
程序1:
import java.util.ArrayList;
class ListNode{
int val;
ListNode next;
ListNode(int val) {
this.val = val;
}
}
public class subject55 {
public static ListNode EntryNodeOfLoop(ListNode pHead) {
if(pHead == null || pHead.next == null) {
return null;
}
ArrayList<ListNode> list = new ArrayList<ListNode>();
list.add(pHead);
ListNode nextpHead = pHead.next;
while(! list.contains(nextpHead)) {
list.add(nextpHead);
nextpHead = nextpHead.next;
}
return nextpHead;
}
}
程序2:
class ListNode{
int val;
ListNode next;
ListNode(int val) {
this.val = val;
}
}
public class subject55 {
public static ListNode EntryNodeOfLoop(ListNode pHead) {
if(pHead == null || pHead.next == null) {
return null;
}
ListNode node1 = pHead.next;
ListNode node2 = pHead.next.next;
//寻找相遇的结点
while(node1 != node2) {
node1 = node1.next;
node2 = node2.next.next;
}
//步长都为 1,找到相遇的结点
//这个结点就是入口
ListNode firstNode = pHead;
while(firstNode != node1) {
firstNode = firstNode.next;
node1 = node1.next;
}
return firstNode;
}
}