刷題--程序員面試金典--面試題 02.07. 鏈表相交(重點)(go)

面試題 02.07. 鏈表相交

給定兩個(單向)鏈表,判定它們是否相交併返回交點。請注意相交的定義基於節點的引用,而不是基於節點的值。換句話說,如果一個鏈表的第k個節點與另一個鏈表的第j個節點是同一節點(引用完全相同),則這兩個鏈表相交。


示例 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 個節點。

示例 2:

輸入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
輸出:Reference of the node with value = 2
輸入解釋:相交節點的值爲 2 (注意,如果兩個列表相交則不能爲 0)。從各自的表頭開始算起,鏈表 A 爲 [0,9,1,2,4],鏈表 B 爲 [3,2,4]。在 A 中,相交節點前有 3 個節點;在 B 中,相交節點前有 1 個節點。

示例 3:

輸入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
輸出:null
輸入解釋:從各自的表頭開始算起,鏈表 A 爲 [2,6,4],鏈表 B 爲 [1,5]。由於這兩個鏈表不相交,所以 intersectVal 必須爲 0,而 skipA 和 skipB 可以是任意值。
解釋:這兩個鏈表不相交,因此返回 null。

注意:

如果兩個鏈表沒有交點,返回 null 。
在返回結果後,兩個鏈表仍須保持原有的結構。
可假定整個鏈表結構中沒有循環。
程序儘量滿足 O(n) 時間複雜度,且僅用 O(1) 內存。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists-lcci
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。


思路:

雙指針,時間複雜度O(m+n) ,分別爲兩個鏈表的長度。

ListNode.png

假設有如圖兩個相交的鏈表,若從A和B分別開始向後遍歷,則從A走到C距離爲AD+DC,從B到C距離爲BD+DC,要想使兩個節點相交(第一次相交的節點必爲交點),則遍歷完ADC後繼續從B開始向C出發,同理遍歷完BDC後從A向C出發。

因爲DC的距離肯定一樣,那麼只要讓兩個指針都遍歷AD+BD(同樣長度),則肯定會相交。

代碼如下:

func getIntersectionNode(headA, headB *ListNode) *ListNode {
    a,b := headA,headB

    for a!=b {
        if a == nil {
            a = headB
        } else {
            a = a.Next
        }
        if b == nil {
            b = headA
        } else {
            b = b.Next
        }
    }

    return a
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章