相交链表(第160题)

题目

编写一个程序,找到两个单链表相交的起始节点。如下图所示的两个链表:

 

 A、B两个链表交于C1这个结点。

示例:

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Reference of the node with value = 8
输入解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。

分析:

  从给出的示例可以看出,这个题要十分注意的就是相交的点,不是值相等就相交了,而是两个单链表中,拥有完全相同的结点,即结点对象是同一个,它不仅值是一样的而且在内存中的地址也是一样的,所以这一点要十分的注意,否则就不能正确解决问题。判断相遇的方法也不是只是判断值相等,而是判断两个指针指向的对象是否一致。那么如何解决呢?

    这里,设A链表的单独部分长度为a、B链表的单独部分长度为b,二者公共部分长度为c。一般情况下,a + c != b + c,但是 a+c+b = b+c+a,用实际的意义去解释这个等式,也就是说两个人分别走各自的路,两个人的路不一定相等,如果两个人走的路有交叉融合的地方,那么即使在各自一次走完各自的路的时候可能无法相遇,但是在各自走完各自的路的时候,开始互相走对方的路,如果二者的路有交叉融合的部分,那么开始互相走对方的路后一定会相遇,而且相遇的地方就是二者的路交叉融合的起始位置。如果没有交叉融合的地方,那么二者不会相遇,而是同时走向对方道路的尽头。

  这也就是说,如果两个人是有缘的,那么即使今生在各自的人生中无法相遇,那么也许来世各自拥有了上一辈子对方的人生,那么一定会相遇的,也就是说命中注定的两个人,在经历了各自不一样的一世之后,你成为了她,她成为了你,你体验了她的人生,她也体验了你的人生,最终相依相存,携手度过余生。哈哈哈,跑偏了。。。。。

    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {

        ListNode l1 = headA;
        ListNode l2 = headB;

        while (l1 != l2){

            l1 = (l1 == null) ? headB : l1.next;
            l2 = (l2 == null) ? headA : l2.next;
        }
        return l1;
    }
原文地址:https://www.cnblogs.com/yxym2016/p/13432210.html