劍指offer第二版(Python3)--面試題52 : 兩個鏈表的第一個公共結點

第2章 面試需要的基礎知識

第3章 高質量的代碼

第4章 解決面試題的思路

第5章 優化時間和空間效率

  面試題39 : 數組中出現次數超過一半的數字

  面試題40 : 最小的k個數

  面試題42 : 連續子數組的最大和

  面試題43 : 從1到n整數中1出現的次數

  面試題45 : 把數組排成最小的數

  面試題49 : 醜數

  面試題50 : 第一個只出現一次的字符

  面試題51 : 數組中的逆序對

  面試題52 : 兩個鏈表的第一個公共結點

第6章 面試中的各項能力

第7章 兩個面試案例


題目描述
牛客網
  輸入兩個鏈表,找出它們的第一個公共結點。

解題思路
  如果兩個鏈表有公共節點,那麼公共節點一定出現在鏈表尾部。從尾部開始查找,但是這是個單向鏈表。我們可以用棧來存儲節點,分別用兩個棧存儲兩個節點,這樣兩個鏈表的尾結點就位於兩個棧的棧頂,接下來比較兩個棧頂的節點是否相同。如果相同,則把棧頂彈出接着比較下一個棧頂,直到找到最後一個相同的節點。這種方法需要O(n)的空間複雜度。下面介紹一種O(1)空間複雜度方法。
  首先用兩個指針遍歷兩個鏈表得到他們的長度,計算兩者長度差s。然後再次遍歷鏈表,在較長的鏈表上先走s步,接着兩個指針一起走,找到第一個相同的節點就是他們第一個公共節點。

實戰

# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def FindFirstCommonNode(self, pHead1, pHead2):
        # write code here
        def findcommonnode(p):
            ptemp = pHead1
            while p.next:
                p, ptemp = p.next, ptemp.next
            p = pHead2
            while p:
                if p == ptemp:
                    return p
                p, ptemp = p.next, ptemp.next
            return None
                
        if not pHead1 or not pHead2:
            return None
        if pHead1 == pHead2:
            return pHead1
        
        p1, p2 = pHead1, pHead2
        while p1.next and p2.next:
            p1, p2 = p1.next, p2.next
        if p1.next:
            return findcommonnode(p1)
        if p2.next:
            return findcommonnode(p2)
        return None
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章