第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