【Leetcode】 链表相交
2020-08-04 本文已影响0人
死鱼
题目
image.png刚开始时直接上暴力遍历过了题目,然后看了大佬的题解,记录下这个双指针的方法
解法:双指针交换
我们目标是找到相交的地址,而不是相同的数值,所以方法就是两边指针先同时向后走,走完了之后,去另一个头重新开始向后走。
-
在最坏情况下,保证两个指针走的路程,的最大值是 len(a)+len(b),因为如果没有相交,两个指针必然走完了两条链表,然后在最后一个nil地方等值。
image.png -
相交的情况下,两个指针最晚也能在第二趟的时候遇到交点并且等值。
image.png
因为双指针本质上就是两个指针走两条链表,而这两条链表是(A->B)和(B->A),把上面的图转换一下
image.png
因为相交的节点,后面接的都是完全一样的,没有区别,问题就是前面有多少个不相交的点,而指针换头就是抵消了前面不相交的点。所以只要有交点,就一定能在双指针遍历中碰到。
代码:
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
}