日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

LeetCode简单题之相交链表

發布時間:2023/11/28 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode简单题之相交链表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目

給你兩個單鏈表的頭節點 headA 和 headB ,請你找出并返回兩個單鏈表相交的起始節點。如果兩個鏈表不存在相交節點,返回 null 。

圖示兩個鏈表在節點 c1 開始相交:

題目數據 保證 整個鏈式結構中不存在環。

注意,函數返回結果后,鏈表必須 保持其原始結構 。

自定義評測:

評測系統 的輸入如下(你設計的程序 不適用 此輸入):

intersectVal - 相交的起始節點的值。如果不存在相交節點,這一值為 0
listA - 第一個鏈表
listB - 第二個鏈表
skipA - 在 listA 中(從頭節點開始)跳到交叉節點的節點數
skipB - 在 listB 中(從頭節點開始)跳到交叉節點的節點數
評測系統將根據這些輸入創建鏈式數據結構,并將兩個頭節點 headA 和 headB 傳遞給你的程序。如果程序能夠正確返回相交節點,那么你的解決方案將被 視作正確答案 。

示例 1:

輸入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3
輸出:Intersected at ‘8’
解釋:相交節點的值為 8 (注意,如果兩個鏈表相交則不能為 0)。
從各自的表頭開始算起,鏈表 A 為 [4,1,8,4,5],鏈表 B 為 [5,6,1,8,4,5]。
在 A 中,相交節點前有 2 個節點;在 B 中,相交節點前有 3 個節點。
示例 2:

輸入:intersectVal = 2, listA = [1,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
輸出:Intersected at ‘2’
解釋:相交節點的值為 2 (注意,如果兩個鏈表相交則不能為 0)。
從各自的表頭開始算起,鏈表 A 為 [1,9,1,2,4],鏈表 B 為 [3,2,4]。
在 A 中,相交節點前有 3 個節點;在 B 中,相交節點前有 1 個節點。
示例 3:

輸入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
輸出:null
解釋:從各自的表頭開始算起,鏈表 A 為 [2,6,4],鏈表 B 為 [1,5]。
由于這兩個鏈表不相交,所以 intersectVal 必須為 0,而 skipA 和 skipB 可以是任意值。
這兩個鏈表不相交,因此返回 null 。
提示:
listA 中節點數目為 m
listB 中節點數目為 n
1 <= m, n <= 3 * 104
1 <= Node.val <= 105
0 <= skipA <= m
0 <= skipB <= n
如果 listA 和 listB 沒有交點,intersectVal 為 0
如果 listA 和 listB 有交點,intersectVal == listA[skipA] == listB[skipB]
進階:你能否設計一個時間復雜度 O(m + n) 、僅用 O(1) 內存的解決方案?

來源:力扣(LeetCode)

解題思路

??看完這道題的題目,假設現在再給定一個條件,比如A比B長多少,或者B比A長多少,那就好做多了;如果有了這個條件我們就可以直接讓兩個鏈表同步走一樣的路,如果相交就能立馬發現,但遺憾的是并沒有這么一個好的條件。所謂沒有條件就需要創造條件,我們需要想辦法比出個長短來,比如,平時下跳跳棋的時候一方已經獲勝,那么另一方如果想知道差距的話就需要計算自己還需要多少步能夠完成,在這里也是一樣,我們可以讓兩個鏈表同步遍歷,一旦有一方到達了終點,那么我們開始清算另一方還需要多少步才能到達終點,需要多少步那就是我們所假設的條件了。得到這個條件我們讓比較長的那一個鏈先走上那么幾步,然后兩個鏈再開始同步遍歷,這個時候就比較好查找相交的結點了。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution:def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:p1=headAp2=headBcount=0flag=1 #A與B長短標記,A長于B為1,B長于A為0while p1 and p2:if p1==p2:  #如果AB一樣長且有交點的話一遍遍歷便可以找到交點return p1p1=p1.nextp2=p2.nextwhile p1:  #第一遍同步遍歷完當A還有剩余時計算還需多少步flag=1count+=1p1=p1.nextwhile p2: #第一遍同步遍歷完當B還有剩余時計算還需多少步flag=0count+=1p2=p2.nextif flag:for i in range(count): #A長的話先讓A走幾步headA=headA.nextelse:for i in range(count): #B長的話先讓B走幾步headB=headB.nextwhile headA:if headA==headB:  #如果找到相交的結點返回即可return headAheadA=headA.nextheadB=headB.next

總結

以上是生活随笔為你收集整理的LeetCode简单题之相交链表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。