相交链表(第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; }