160. 相交链表

148 阅读1分钟

题目:
给你两个单链表的头节点 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
}