题目
给你两个单链表的头节点 headA
和 headB
,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null
。
图示两个链表在节点 c1
开始相交 :
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
题解
方式一:双指针
两个指针分别从A、B头节点开始,每次移动一个位置,走到当前链表尾部时转向另一个链表头节点。
两指针相遇的节点就是结果
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode p1 = headA;
ListNode p2 = headB;
// 链表长度一致,则一次遍历后p1、p2同时为null
// 链表长度不一致,则两次遍历后p1、p2同时为null
while(p1 != null || p2 != null) {
if (p1 == null) p1 = headB;
if (p2 == null) p2 = headA;
if (p1 == p2) {
return p1;
}
p1 = p1.next;
p2 = p2.next;
}
return null;
}
方式二:哈希表
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
HashSet<ListNode> 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;
}
总结
算法:双指针
数据结构:哈希表