leetcode 相交鏈表 python實現

來源:互聯網
上載者:User

標籤:雜湊表   leetcode   倒數   style   指標   迴圈   接下來   tno   ==   

 

這道題 要想解決其實不難, 開兩層迴圈進行遍曆就能實現,但是會逾時

 

如果想要O(n) 的時間複雜度, 我考慮用雜湊表來儲存遍曆過的元素,如果發現當前遍曆的元素在雜湊表裡,那說明交叉點就在這

這裡利用了雜湊表的尋找時間是O(1)

但是這種演算法不能滿足空間複雜度是O(1)的要求

代碼像這樣:

 1 class Solution(object): 2     def getIntersectionNode(self, headA, headB): 3         """ 4         :type head1, head1: ListNode 5         :rtype: ListNode 6         """ 7         # 如果有一個鏈表是空的 那就沒有交叉 8         if headA is None or headB is None: 9             return None10         # 計算一下兩個鏈表的長度11         ca = headA12         cb = headB13         ta, tb = 1, 114         while ca.next is not None:15             ta += 116             ca = ca.next17         while cb.next is not None:18             tb += 119             cb = cb.next20         # 如果最後一個元素都不一樣說明沒有交叉21         if ca.val != cb.val:22             return None23         # 如果兩個鏈表長度不一樣,將長得鏈表指標後移24         ca = headA25         cb = headB26         while tb > ta:27             tb -= 128             cb = cb.next29         while ta > tb:30             ta -= 131             ca = ca.next32         # 從倒數長度相同的 短的鏈表的開頭開始一位一位比較33         while ca is not None and cb is not None:34             if ca.val == cb.val:35                 return ca36             ca = ca.next37             cb = cb.next

 

 

經過一段時間思考,如果要滿足空間複雜度是O(1) 那就不能開闢新空間,智能用指標來回移動的辦法

1 如果任何一個鏈表是空的說明沒有交叉

2 如果鏈表交叉了最後一個元素肯定相同, 如果不相同說明沒交叉

3 如果確定了有交叉,計算一下兩個鏈表的長度,

  思想是 調整到一樣長,然後位元壓縮 這樣一次遍曆就可以

  具體這樣做: 每個鏈表都有一個遍曆指標, 

    短的鏈表的指標在頭部

    長的鏈表指標後移若干位,一直到 兩個鏈表從尾巴開始數 到遍曆指標的長度是相同的

    接下來就一遍遍曆 每一位都比較一下是否相等就可以

  這樣沒有開闢新的空間 時間上是一遍遍曆O(n)

 

 1 class Solution(object): 2     def getIntersectionNode(self, headA, headB): 3         """ 4         :type head1, head1: ListNode 5         :rtype: ListNode 6         """ 7         # 建立一個雜湊表,把每個第一次遍曆到的元素存進去 8         # 如果發現之前存過當前元素說明交叉了 9         dic = {}10         ca = headA11         cb = headB12         while ca is not None or cb is not None:13             if ca is not None:14                 try:15                     dic[ca.val]16                     return ca17                 except:18                     dic[ca.val] = True19                     ca = ca.next20             if cb is not None:21                 try:22                     dic[cb.val]23                     return cb24                 except:25                     dic[cb.val] = True26                     cb = cb.next27         return None

 

leetcode 相交鏈表 python實現

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.