题目
代码
方法一 HashSet遍历
就只需要利用hashSet不能存储重复的对象的特性就好啦(
遍历两遍, 空间复杂度不满足题目要求的尽量的O(1)
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
HashSet<ListNode> hashSet = new HashSet<>();
while (headA != null) {
hashSet.add(headA);
headA = headA.next;
}
while (headB != null) {
if (!hashSet.add(headB)) {
return headB;
}
headB = headB.next;
}
return null;
}
}
方法二 数学解法
假设A链的长度为a
B链的长度为b
A和B共有的长度为c
易得
a + (b - c) = (a - c) + b
他们终会相识, 在那遥远的苍穹
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode A = headA, B = headB;
while (A != B) {
//假设A链表遍历完了就开始遍历B链表
if (A != null) {
A = A.next;
}else {
A = headB;
}
//假设B链表遍历完了就开始遍历B链表
if (B != null) {
B = B.next;
}else {
B = headA;
}
}
//因为我们知道a + (b - c) = (a - c) + b
//所以他们最后一定会在相交的节点相遇或者为null
return A;
}
}