題目
image.png
剛開始時直接上暴力遍歷過了題目,然后看了大佬的題解,記錄下這個雙指針的方法
解法:雙指針交換
我們目標(biāo)是找到相交的地址,而不是相同的數(shù)值泣特,所以方法就是兩邊指針先同時向后走,走完了之后挑随,去另一個頭重新開始向后走状您。
-
在最壞情況下,保證兩個指針走的路程兜挨,的最大值是 len(a)+len(b)膏孟,因為如果沒有相交,兩個指針必然走完了兩條鏈表拌汇,然后在最后一個nil地方等值柒桑。
image.png -
相交的情況下,兩個指針最晚也能在第二趟的時候遇到交點并且等值噪舀。
image.png
因為雙指針本質(zhì)上就是兩個指針走兩條鏈表魁淳,而這兩條鏈表是(A->B)和(B->A),把上面的圖轉(zhuǎn)換一下
image.png
因為相交的節(jié)點界逛,后面接的都是完全一樣的,沒有區(qū)別息拜,問題就是前面有多少個不相交的點净响,而指針換頭就是抵消了前面不相交的點少欺。所以只要有交點,就一定能在雙指針遍歷中碰到别惦。
代碼:
func getIntersectionNode(headA, headB *ListNode) *ListNode {
tempA := headA
tempB := headB
for tempA != tempB {
if tempA != nil {
tempA = tempA.Next
} else {
tempA = headB
}
if tempB != nil {
tempB = tempB.Next
} else {
tempB = headA
}
}
return tempA
}