建立兩個指針 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; }