天天看點

python 相交連結清單|相交連結清單|題解

|相交連結清單

給你兩個單連結清單的頭節點 headA 和 headB ,請你找出并傳回兩個單連結清單相交的起始節點。如果兩個連結清單不存在相交節點,傳回 null 。

圖示兩個連結清單在節點 c1 開始相交:

python 相交連結清單|相交連結清單|題解

題目資料 保證 整個鍊式結構中不存在環。

注意,函數傳回結果後,連結清單必須 保持其原始結構 。

自定義評測:

評測系統 的輸入如下(你設計的程式 不适用 此輸入):

intersectVal - 相交的起始節點的值。如果不存在相交節點,這一值為 0

listA - 第一個連結清單

listB - 第二個連結清單

skipA - 在 listA 中(從頭節點開始)跳到交叉節點的節點數

skipB - 在 listB 中(從頭節點開始)跳到交叉節點的節點數

評測系統将根據這些輸入建立鍊式資料結構,并将兩個頭節點 headA 和 headB 傳遞給你的程式。如果程式能夠正确傳回相交節點,那麼你的解決方案将被 視作正确答案 。

python 相交連結清單|相交連結清單|題解

輸入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3

輸出:Intersected at ‘8’

解釋:相交節點的值為 8 (注意,如果兩個連結清單相交則不能為 0)。

從各自的表頭開始算起,連結清單 A 為 [4,1,8,4,5],連結清單 B 為 [5,6,1,8,4,5]。

在 A 中,相交節點前有 2 個節點;在 B 中,相交節點前有 3 個節點。

python 相交連結清單|相交連結清單|題解

輸入:intersectVal = 2, listA = [1,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1

輸出:Intersected at ‘2’

解釋:相交節點的值為 2 (注意,如果兩個連結清單相交則不能為 0)。

從各自的表頭開始算起,連結清單 A 為 [1,9,1,2,4],連結清單 B 為 [3,2,4]。

在 A 中,相交節點前有 3 個節點;在 B 中,相交節點前有 1 個節點。

python 相交連結清單|相交連結清單|題解

輸入: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 。

|題解

python 相交連結清單|相交連結清單|題解
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    """
    解題思路:
    1.先計算A連結清單和B連結清單的長度
    2.讓長的連結清單先走,len(長) - len(短)
    3.然後同步先後執行 如果相等 return
    """
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        countA = 0
        countB = 0
        curA = headA
        curB = headB

        # 計算連結清單A的長度
        while curA:
            countA += 1
            curA = curA.next
        
        # 計算連結清單B的長度
        while curB:
            countB += 1
            curB = curB.next
        
        A = headA
        B = headB
        if countA > countB:
            return self.perse(countA, countB, A, B)
        else:
            return self.perse(countB, countA, B, A)

        return None
        
    
    def perse(self, countA, countB, A, B):
        diff = countA - countB
        count = 0
        while A:
            if count >= diff:
                if A == B:
                    return A
                A = A.next
                B = B.next
            else:
                A = A.next
                count += 1