编写一个程序,找到两个单链表相交的起始节点。
如下面的两个链表:
思路:
假设链表A的长度为a,链表B的长度为b,相交后的链表长度为c。初始化pa、pb两个工作指针分别为A、B链表的头节点,分别遍历链表,当遍历到C链表尾部时,再分别赋值pa=B链表头节点,pb=A链表头节点。如若两个链表相交则终会有一刻两工作指针指向同一结点。这是为什么呢?可以作如下思考:相交则有a+c+b+c=b+c+a+c,不相交则有a+b=b+a(c=0)。实际上是补齐了两工作指针走过的路程。与之前环形链表套圈的思维相似。
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA==null||headB==null)
return null;
ListNode p1=headA;
ListNode p2=headB;
while(p1!=p2){
p1=p1==null?p1=headB:p1.next;
p2=p2==null?p2=headA:p2.next;
}
return p1;
}
}