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)。