两个链表判断是否相交
例如:
A:1,2,3,4,5
B:6,3,4,5
相交。
思路一:链表不能判断长度,而且两层for循环时间复杂度很高,所以用哈希表存放一个链表的结点,再遍历另一个链表,判断哈希表中是否有值,如果有值说明在这个值的位置相交。
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
HashSet<ListNode> listNodes = new HashSet<>();
while (headA != null){
listNodes.add(headA);
headA = headA.next;
}
while (headB != null){
if (listNodes.contains(headB)){
return headB;
}
headB = headB.next;
}
return null;
}
思路二:之所以不用for同步遍历链表,是因为链表的长度不能确定,不能判断从哪里开始相交,所以可以通过右对齐,缺的位置补上。(最好不要用NULL补空,会混淆链表结束判断)。
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null) {
return null;
}
ListNode pA = headA, pB = headB;
while (pA != pB) {
pA = pA == null ? headB : pA.next;
pB = pB == null ? headA : pB.next;
}
return pA;
}
pA == null,链表A结束,拼接B,否则继续遍历(通过A+B对齐,比较常见的一种对齐方法)