鏈表中環的入口結點

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指向環的入口。

發佈了57 篇原創文章 · 獲贊 48 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章