1.題目描述
一個鏈表中包含環,請找出該鏈表的環的入口結點。
傳送門
2.code(java1.7版本)
nlogn複雜度的代碼
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
import java.util.*;
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead){
HashMap<ListNode,Integer> map=new HashMap<ListNode,Integer>();
if(pHead==null)return null;
while(pHead!=null){
if(map.containsKey(pHead)){
break;
}
else{
map.put(pHead,1);
}
pHead=pHead.next;
}
return pHead;
}
}
n+c的複雜度,其中c代表鏈表的環的長度
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
import java.util.*;
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead){
if(pHead==null)return null;
ListNode p1=pHead;
ListNode p2=pHead;
while(p1!=null&&p2!=null&&p2.next!=null){
p1=p1.next;
p2=p2.next.next;
if(p1==p2){
p2=pHead;
while(p1!=p2){
p1=p1.next;
p2=p2.next;
}
if(p1==p2)return p1;
}
}
return null;
}
}
3.解題思路
nlogn的複雜度
這個算法就是直接對鏈表進行遍歷,並運用HashMap進行節點的保存,如果在HashMap中再次發現遍歷過的節點,則就是環的入口節點。
n+c的複雜度
第一步,找環中相匯點。分別用p1,p2指向鏈表頭部,p1每次走一步,p2每次走二步,直到p1==p2找到在環中的相匯點。
第二步,找環的入口。接上步,當p1==p2時,p2所經過節點數爲2x,p1所經過節點數爲x,設環中有n個節點,p2比p1多走一圈有2x=n+x; n=x;可以看出p1實際走了一個環的步數,再讓p2指向鏈表頭部,p1位置不變,p1,p2每次走一步直到p1==p2; 此時p1指向環的入口。