
翻译一下:
就是两个链表,如果他们相交,他们就共享交点之后的节点,然后要返回第一个相交的点,如果没有相交就返回NULL。
思路:像这种链表相关的题我们一般都可以想想指针,这道题我们可以用双指针。假设:
A:
a1 → a2 → c1 → c2 → c3B:
b1 → b2 → b3 → c1 → c2 → c3指针移动过程:
pA = a1,pB = b1一步步走,
pA到a2,pB到b2
pA到c1,pB到b3
pA到c2,pB到c1(还没相等)
pA到c3,pB到c2
pA到null,pB到c3
pA跳到headB(b1),pB到null
pA到b2,pB跳到headA(a1)
pA到b3,pB到a2
pA到c1,pB到c1→ 相遇,返回c1PA走过的总路程是A不相交的点+共享节点+B不相交的节点
PB走的是B不相交的点+共享节点+A不相交的点
如果两个链表相交那最终他们PA和PB一定会相遇并且在第一次相交的点相遇。
代码:
java
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null || headB == null){
return null;
}
ListNode pA = headA;
ListNode pB = headB;
//当pa和pb不相交时一直循环
while(pA!=pB){
pA = (pA == null) ? headB : pA.next;
pB = (pB == null) ? headA : pB.next;
}
//返回的要么是null两个不相交,要么是交点
return pA;
}
}
