问题:给定两个(单向)链表,判定它们是否相交并返回交点。请注意相交的定义基于节点的引用,而不是基于节点的值。换句话说,如果一个链表的第k个节点与另一个链表的第j个节点是同一节点(引用完全相同),则这两个链表相交。
在此题中,我们使用一个新的链表list存储headA,然后将B的引用和list的引用对比,如果存在,则返回引用节点,否则返回null。
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null) {
return null;
}
List<ListNode> list = new LinkedList<>();
ListNode curA = headA;
while (curA != null) {
list.add(curA);
curA = curA.next;
}
ListNode curB = headB;
while (curB != null) {
if (list.contains(curB)) {
return curB;
}
curB = curB.next;
}
return null;
}
注意:第二种思路 采用双指针法。
一针指向headA,一针指向headB。若相遇则返回,否则返回null。
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null || headB == null) return null;
ListNode curA = headA,curB = headB;
// 判断条件为,curA==null而curB!=null,反之亦然
while(curA != curB){
curA = curA == null ? headB : curA.next;
curB = curB == null ? headA : curB.next;
}
return curA;
}