題目鏈接
https://leetcode-cn.com/problems/intersection-of-two-linked-lists/
題目描述
代碼初步
- 思路:兩個單鏈表的狀態有兩種,一種不相交,另一種相交。
1.當相交時,我們假設相交點爲c,鏈表A頭部到c的距離爲m,鏈表B到c的距離爲n,c到兩個鏈表的尾部距離爲x。用兩個指針依次循環遍歷兩個鏈表,如果有一個先遍歷完,則讓它指向另一個鏈表的頭部再繼續遍歷,直到兩指針相遇。
爲什麼兩個指針會相遇,將c點看成是終點的話,鏈表A走過的路程是m+x+n,鏈表B走過的路程是n+x+m,距離相等,所以最後一定會相遇。
2.當不相交時,兩指針沒有指向同一個地址,return None.
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def getIntersectionNode(self, headA, headB):
"""
:type head1, head1: ListNode
:rtype: ListNode
"""
if headA ==None or headB==None:
return None
pa = headA
pb = headB
while(pa!=pb):
if not pa:
pa=headB
else:
pa=pa.next
if not pb:
pb=headA
else:
pb = pb.next
return pa
代碼欣賞
-
思路開拓:採用哈希表法
遍歷鏈表 A 並將每個結點的地址/引用存儲在哈希表中。然後檢查鏈表 B 中的每一個結點 b是否在哈希表中。若在,則 b爲相交結點。 -
複雜度分析
時間複雜度 : O(m+n)。
空間複雜度 : O(m) 或 O(n)。
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def getIntersectionNode(self, headA, headB):
"""
:type head1, head1: ListNode
:rtype: ListNode
"""
pa = headA
pb = headB
hash_table={}
while headA:
hash_table[headA]=1
headA = headA.next
while headB:
if headB in hash_table:
return headB
headB = headB.next
return None