一个双指针问题
两个链表,找出它们的第一个公共节点。
我们使用两个指针 node1,node2 分别指向两个链表 headA,headB 的头结点,然后同时分别逐结点遍历,当 node1 到达链表 headA 的末尾时,重新定位到链表 headB 的头结点;当 node2 到达链表 headB 的末尾时,重新定位到链表 headA 的头结点。
这样,当它们相遇时,所指向的结点就是第一个公共结点。
好理解的解释:两个链表长度分别为L1+C、L2+C, C为公共部分的长度,按照楼主的做法: 第一个人走了L1+C步后,回到第二个人起点走L2步;第2个人走了L2+C步后,回到第一个人起点走L1步。 当两个人走的步数都为L1+L2+C时就两个家伙就相爱了
func getIntersectionNode(headA, headB *ListNode) *ListNode {
/*法一
if headA == nil || headB == nil{
return nil
}
p, q := headA, headB
for p!=nil{
q = headB
for q!=nil{
if p == q{
return p
}else{
q = q.Next
}
}
p = p.Next
}
return nil*/
//法二
if headA == nil || headB == nil{
return nil
}
p, q := headA, headB
for p != q{ //一定要让p q能== nil 否则如果没有公共节点,就结束不了了
if p == nil{
p = headB
}else{
p = p.Next
}
if q == nil{
q = headA
}else{
q = q.Next
}
}
return p
}