LeetCodeWithPython 160. 相交鏈表

題目鏈接

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

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章