LeetCode-160-相交链表
思路
1.哈希表
A先遍历链表,使用哈希表存储A遍历过的节点,然后B遍历,同时查询哈希表中是否存在该节点。
2.双指针法
参考教你用浪漫的方式找到两个单链表相交的起始节点
一种比较巧妙的方式是,分别为链表A和链表B设置指针A和指针B,然后开始遍历链表,如果遍历完当前链表,则将指针指向另外一个链表的头部继续遍历,直至两个指针相遇。
最终两个指针分别走过的路径为:
指针A :a+c+b
指针B :b+c+a
明显 a+c+b = b+c+a,因而如果两个链表相交,则指针A和指针B必定在相交结点相遇。
代码
//1.哈希表
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
Set<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;
}
}
//2.双指针
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA==null||headB==null)return null;
ListNode a=headA;
ListNode b=headB;
while(a!=b){
a=a==null?headB:a.next;
b=b==null?headA:b.next;
}
return a;
}
}