题目描述
输入两个链表,找出它们的第一个公共节点。
來源:力扣(LeetCode)
如下面的两个链表:
解題思路
-
以題目的示例 1 為例: skipA=2 代表鏈表A前兩個不是公共節點 ; skipB=3 代表鏈表B 前三個不是公共節點。這裡隱含了我們接下來的解法可以參考『長度』。
-
指針 & 鏈表的關係使用
- 設定指針去分別計算兩個鏈表的長度
- 若無設定指針的話,headA & headB 的值會發生改變
-
第一步:先算出兩個鏈表的長度,使之對齊。
-
第二步:使第一個位置鏈表始終為最長的那個鏈表。
-
第三步:當兩個鏈表都一樣長的時候,取到第一個一樣的節點時,就為公共節點。
Python 代碼
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
n1=n2=0
p1=headA
p2=headB
while p1:
p1 = p1.next
n1+=1
while p2:
p2 = p2.next
n2+=1
if n1 < n2:
headA, headB, = headB, headA
n1, n2 = n2, n1
for i in range(n1-n2):
headA = headA.next
while headA and headB:
if headA == headB:
return headA
else:
headA = headA.next
headB = headB.next
return None