判斷鏈表是否相交併返回交點

  1. 暴力破解,輪詢鏈表A,判斷A中的每個節點在鏈表B中是否存在
  2. 哈希表(HashMap),先遍歷一遍鏈表 A,用哈希表把每一個節點都記錄下來,再去遍歷鏈表 B,找到在哈希表中出現過的節點即爲兩個鏈表的交點
  3. 雙指針法

建立兩個指針 pApA 和 pBpB,分別初始化爲鏈表 A 和 B 的頭結點。而後讓它們向後逐結點遍歷。
當 pA 到達鏈表的尾部時,將它重定位到鏈表 B 的頭結點,相似的,當 pB 到達鏈表的尾部時,將它重定位到鏈表 A 的頭結點。
若在某一時刻 pA 和 pB 相遇,則 pA/pB 爲相交結點。(本人使用的此解法)node

public static ListNode getIntersectionNode1(ListNode headA, ListNode headB) {
    if (headA == null || headB == null) {
        return null;
 }
    ListNode pA = headA, pB = headB;
 while (pA != pB) {
        pA = pA == null ? headB : pA.next;
 pB = pB == null ? headA : pB.next;
 }
    return pA;
}

4.先統計兩個鏈表的長度,先統計兩個鏈表的長度,若是兩個鏈表的長度不同,就讓鏈表長的先走,直到兩個鏈表長度同樣,這個時候兩個鏈表再同時每次日後移一步,看節點是否同樣,若是有相等的,說明這個相等的節點就是兩鏈表的交點,不然若是走完了尚未找到相等的節點,說明他們沒有交點,直接返回null便可指針

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
    int lenA = length(headA), lenB = length(headB);
    while (lenA != lenB) {
        if (lenA > lenB) {
            headA = headA.next;
            lenA--;
        } else {
            headB = headB.next;
            lenB--;
        }
    }
    while (headA != headB) {
        headA = headA.next;
        headB = headB.next;
    }
    return headA;
}

//統計鏈表的長度
private int length(ListNode node) {
    int length = 0;
    while (node != null) {
        node = node.next;
        length++;
    }
    return length;
}
相關文章
相關標籤/搜索