160. 相交链表

编写一个程序,找到两个单链表相交的起始节点。

方法:初看很难理解,但是细想就会发现很简单很巧妙 A和B两个链表长度可能不同,但是A+B和B+A的长度是相同的,所以遍历A+B和遍历B+A一定是同时结束。 如果A,B相交的话A和B有一段尾巴是相同的,所以两个遍历的指针一定会同时到达交点 如果A,B不相交的话两个指针就会同时到达A+B的尾节点。
可以理解成两个人速度一致, 走过的路程一致。那么肯定会同一个时间点到达终点。如果到达终点的最后一段路两人都走的话,那么这段路上俩人肯定是肩并肩手牵手的。
对齐法,强行环形链表。

image.png

func getIntersectionNode(headA, headB *ListNode) *ListNode {
    if head1 == nil || head2 == nil {
        return nil
    }

    cur1,cur2 := headA,headB
    for cur1 != cur2 {                                //对齐链表
        if cur1 == nil {
            cur1 = headB
        } else {
            cur1 = cur1.Next
        }
        if cur2 == nil {
            cur2 = headA
        } else {
            cur2 = cur2.Next
        }
    }

    return cur1 //变化的指针,此时正好在此,返回下一个指针值の索引
}