160. 相交链表
弗洛伊德算法,快慢指针可解
假设headA与headB相交,且分别长a+c,b+c(c为相交长度)
那么必然存在a+c+b+c=b+c+a+c(即当我们遍历完headA后再遍历headB与
先遍历headB再遍历headA,最终一定会在同一节点处相遇)
然后我们发现,即使不相交,依然存在a+b=b+a,此时c=0,即在null处相交。
时间O(m+n)(即2条链表的长度和),空间O(1)
public ListNode getIntersectionNode(ListNode headA, ListNode headB) { ListNode p1 = headA,p2=headB; while(p1!=p2){ // 本链表遍历完后则遍历下一链表 // 注意这里是p1==null 而不是p1.next==null // 假如判断条件为p1.next==null那么p1与p2永远不会为null // 那么在不相交的情况下p1!=p2恒等,因此需要设置为p1==null p1 = p1==null ? headB:p1.next; p2 = p2==null ? headA:p2.next; } return p1; }
争取早日不再是一只菜鸡