链表相交
面试题 02.07. 链表相交
同:160.链表相交
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
图示两个链表在节点 c1 开始相交:

题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
示例 1:

示例 2:

示例 3:


#思路
简单来说,就是求两个链表交点节点的指针。 这里同学们要注意,交点不是数值相等,而是指针相等。
为了方便举例,假设节点元素数值相等,则节点指针相等。
看如下两个链表,目前curA指向链表A的头结点,curB指向链表B的头结点:

我们求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置,如图:

此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点。
否则循环退出返回空指针。
package main
func getIntersectionNode(headA, headB *ListNode) *ListNode {
curA:=headA
curB:=headB
lenA:=0
lenB:=0
tmp1:=0
for curA!=nil{
curA=curA.Next
lenA++
}
for curB!=nil{
curB=curB.Next
lenB++
}
curA=headA
curB=headB
if lenB>lenA{
tmp1=lenA
lenA=lenB
lenB=tmp1
curB=headA
curA=headB
}
gap:=lenA-lenB
for ;gap>0;gap--{
curA=curA.Next
}
for curA!=nil{
if curA==curB{
return curA
}
curA=curA.Next
curB=curB.Next
}
return nil
}
双指针法
我们总是可以把它想像成运动问题,如果我想知道C点(注意AC与BC不一定一样长),而只有两个人,怎么跑才能让他们相遇在C点呢?总不能说一个先跑到C等另一个吧,那还求个锤子?你都知道C了。
因为C点是一个未知点,我们用从速度来着手。(快慢指针也是这样)
如果同速度,那路程相同就可以了,所以第一个人跑AD然后再从B开始跑BC,第二个人跑BD然后跑AC。因为总的路程一样,所以。
A D + B C = B D + A C AD + BC = BD + AC
AD+BC=BD+AC
那这时相等就肯定是C点。
package main
func getIntersectionNode(headA, headB *ListNode) *ListNode {
curA:=headA
curB:=headB
lenA:=0
lenB:=0
tmp1:=0
for curA!=nil{
curA=curA.Next
lenA++
}
for curB!=nil{
curB=curB.Next
lenB++
}
curA=headA
curB=headB
if lenB>lenA{
tmp1=lenA
lenA=lenB
lenB=tmp1
curB=headA
curA=headB
}
gap:=lenA-lenB
for ;gap>0;gap--{
curA=curA.Next
}
for curA!=nil{
if curA==curB{
return curA
}
curA=curA.Next
curB=curB.Next
}
return nil
}

浙公网安备 33010602011771号