(鏈表)求相交鏈表交點


 

1.問題描述:

編寫一個程序,找到兩個單鏈表相交的起始節點。

如下面的兩個鏈表:

 

在節點 c1 開始相交。

 

 

 

2.使用雙指針解決該題

2.1 思路與圖解

若相交,鏈表A: a+c, 鏈表B : b+c. a+c+b+c = b+c+a+c 。則會在公共處c起點相遇。若不相交,a +b = b+a 。因此相遇處是NULL

 

2.2 代碼實現:

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if(headA == null || headB == null) return null;
        ListNode pA = headA, pB = headB;
        // 在這里第一輪體現在pA和pB第一次到達尾部會移向另一鏈表的表頭, 而第二輪體現在如果pA或pB相交就返回交點, 不相交最后就是null==null
        while(pA != pB) {
            pA = pA == null ? headB : pA.next;
//三目運算
//表達式1 ? 表達式2:表達式3;
//表達式1必須是一個條件表達式或者返回值必須為boolean類型的。表達式2和表達式3則沒有什么要求。
//當表達式1的返回值為true時,返回表達式2的值。否則,返回表達式3的值。
//當pA==null時,PA=headB,也就是B鏈表的頭結點;當PA!=null 時,PA=PA.next
pB
= pB == null ? headA : pB.next; } return pA; }

 2.3 復雜度分析

   時間復雜度 : O(m+n)

   空間復雜度 : O(1)

3.使用哈希表解題

3.1 思路:遍歷鏈表 A 並將每個結點的地址/引用存儲在哈希表中。然后檢查鏈表 B 中的每一個結點 bi是否在哈希表中。若在,則 bi為相交結點

 

3.2 代碼實現

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        Set s = new HashSet();
        ListNode p = headA;
        ListNode q = headB;
        //定義一個set之后,不斷遍歷p鏈表,然后將所有元素加入到set中
        while(p!=null) {
            s.add(p);
            p = p.next;
        }
        while(q!=null) {
            //遍歷q鏈表,如果q鏈表的元素出現在set中,
            //重合,而這個重合的就是第一個相交的節點就說明
            //p和q兩個鏈表有
            if(s.contains(q)) {
                return q;
            }
            q = q.next;
        }
        return null;
    }
}

 

3.3復雜度分析

時間復雜度 : O(m+n)。
空間復雜度 : O(m) 或 O(n)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM