题解一:
哈希表:两链表出现的第一个相同的值就是相交节点,因此我们先用哈希记录链表A所有出现过的值,再遍历链表B查找哈希表,找出第一个相同的值即为结果。
import java.util.HashSet;public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {HashSet<ListNode> set = new HashSet();ListNode temp = headA;while (temp != null) {set.add(temp);temp = temp.next;}temp = headB;while (temp != null) {if (set.contains(temp)) return temp;temp = temp.next;}return null;}
}
题解二:
双指针遍历:以指针a,指针b分别遍历链表A和链表B。当指针a到达链表A末尾时,从链表B起点开始继续遍历;当指针b到达链表B末尾时,从链表A开始继续遍历。这样,如果两链表有相交点的话,指针ab会同时到达这个交点。
理由是链表AB具有相同段和不同段,记不同段为Ta、Tb,记相同段为Tc,则按上述步骤遍历至交点时,指针ab的路径Ta+Tc+Tb = Tb+Tc+Ta。
public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {if (headA == null || headB == null) return null;ListNode a = headA;ListNode b = headB;while (true) {if (a == b)break;if (a != null) {a = a.next;} else {a = headB;}if (b != null) {b = b.next;} else {b = headA;}}return a;}
}