劍指 Offer52連結串列——兩個連結串列的第一個公共節點
阿新 • • 發佈:2021-01-11
題目:
輸入兩個連結串列,找出它們的第一個公共節點。
如下面的兩個連結串列:
在節點 c1 開始相交。
示例 1:
輸入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
輸出:Reference of the node with value = 8
輸入解釋:相交節點的值為 8 (注意,如果兩個列表相交則不能為 0)。從各自的表頭開始算起,連結串列 A 為 [4,1,8,4,5],連結串列 B 為 [5,0,1,8,4,5]。在 A 中,相交節點前有 2 個節點;在 B 中,相交節點前有 3 個節點。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/liang-ge-lian-biao-de-di-yi-ge-gong-gong-jie-dian-lcof
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
分析:
雙指標,分別從兩個連結串列向前遍歷,當兩個指標相遇時返回對應結點即可。當任意指標到達連結串列的末尾時,重新定位到另一個連結串列 的頭結點。這樣每個指標最多隻用把每條連結串列都遍歷一遍。
思路:
雙指標
程式碼實現:
時間複雜度O(n),空間複雜度O(1)
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == headB) {
return headA;
}
if (headA == null || headB == null) {
return null;
}
ListNode nodeA = headA;
ListNode nodeB = headB;
while (nodeA != nodeB) {
// 這裡是判斷curr結點而不是currA.next
nodeA = nodeA == null ? headB : nodeA.next;
nodeB = nodeB == null ? headA : nodeB.next;
}
return nodeA;
}
}