1. 程式人生 > 其它 >劍指 Offer52連結串列——兩個連結串列的第一個公共節點

劍指 Offer52連結串列——兩個連結串列的第一個公共節點

技術標籤:劍指offerjava演算法攻略

題目:

輸入兩個連結串列,找出它們的第一個公共節點。

如下面的兩個連結串列:

在這裡插入圖片描述

在節點 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; } }