题目:LCR 023
解法一:哈希表
将链表A所有元素放入Set
中,遍历链表B元素,若某一元素在Set
中存在,则该元素便是重复元素
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
Set<Object> set = new HashSet<>();
while (headA != null) {
set.add(headA);
headA = headA.next;
}
while (headB != null) {
if (set.contains(headB)) {
return headB;
}
headB = headB.next;
}
return null;
}
解法二:双指针
指针A指向链表A头节点,指针B指向链表B头节点,二者同时遍历,若某一链表遍历结束,则转向另一链表遍历,当两指针指向相同元素时,便是两链表相交结点。
注意:指针移动指向另一个链表头部的条件应该为 nodeA == null
,而非 nodeA.next == null
,因为当两个链表不相同时,跳出循环的条件为二者均为null
,若不让指针指向null
,则会一直循环
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode nodeA = headA, nodeB = headB;
while (nodeA != nodeB) {
nodeA = (nodeA == null) ? headB : nodeA.next;
nodeB = (nodeB == null) ? headA : nodeB.next;
}
return nodeA;
}