面試52題:面試
題目:兩個鏈表的第一個公共節點spa
題:輸入兩個鏈表,找出它們的第一個公共節點。code
解題思路:blog
①蠻力法:在第一個鏈表上順序遍歷每一個節點,每遍歷到一個節點,就在第二個鏈表上順序遍歷每一個節點,直到找到第二個鏈表上有節點和第一個鏈表上的節點同樣中止。(O(mn))utf-8
②若是從兩個鏈表的尾部開始往前比較(後進先出),那麼最後一個相同節點就是咱們要找的節點,爲此能夠藉助兩個棧,棧頂元素都同樣則pop出去,知道找到最後一個相同的元素爲止。(時間複雜度O(m+n),且須要額外輔助空間)it
③首先遍歷兩個鏈表獲得它們的長度,若是m>n,則m鏈表先走m-n步,而後兩個鏈表再同時走,直到找到第一個相同的節點(即爲它們的第一個公共節點)。(推薦,時間複雜度O(m+n),且不須要額外輔助空間)io
解題代碼:class
# -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def FindFirstCommonNode(self, pHead1, pHead2): length1=self.GetLength(pHead1) length2=self.GetLength(pHead2) if length1>length2: headLong=pHead1 headShort=pHead2 else: headLong=pHead2 headShort=pHead1 diff=abs(length1-length2) for i in range(diff): headLong=headLong.next while headLong!=None and headShort!=None and headLong!=headShort: headLong=headLong.next headShort=headShort.next return headLong def GetLength(self,pHead): length=0 while pHead: pHead=pHead.next length += 1 return length