题目:
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
图示两个链表在节点 c1 开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/in… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法:
假设A,B相交,A,B的长度可以表示为:
A = l1 + l
B = l2 + l
遍历A+B会相遇在相交点:
A = l1 + l + l2
B = l2 + l + l1
假设A,B相交,A,B的长度可以表示为:
A = l1 + l3
B = l2 + l4
遍历A+B会相同时遍历到末尾节点:
A = l1 + l3 + l2 + l4
B = l2 + l4 + l1 + l3
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func getIntersectionNode(headA, headB *ListNode) *ListNode {
// headACopy, headBCopy := headA, headB
ha := headA
hb := headB
aFinished, bFinished := false, false
for ha != nil && hb != nil {
if ha == hb {
return ha
}
if ha.Next == nil && !aFinished{
aFinished = true
ha = headB
} else {
ha = ha.Next
}
if hb.Next == nil && !bFinished{
bFinished = true
hb = headA
} else {
hb = hb.Next
}
}
return nil
}