https://leetcode-cn.com/problems/intersection-of-two-linked-lists-lcci/
哈希表。先将链表A中的的节点都放入哈希表,然后依次放入链表B中的节点,如果当前节点在哈希表中已存在证明链表相交。时间复杂度:O(N)
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
Set existNodeSet = new HashSet<>(100);
ListNode tempA = headA;
ListNode tempB = headB;
while (tempA != null) {
existNodeSet.add(tempA);
tempA = tempA.next;
}
while (tempB != null) {
if (existNodeSet.contains(tempB)) {
return tempB;
}
tempB = tempB.next;
}
return null;
}
双指针法。
1.先遍历链表获取链表的长度lengthA,lengthB。
2.链表长度大的先走|lenthA-lengthB|。
3.现在两个指针处于同一起跑线,同时向后遍历,如果当前节点相等即相交。
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode tempA = headA;
ListNode tempB = headB;
int lengthA = 0;
int lengthB = 0;
while (tempA != null) {
tempA = tempA.next;
lengthA++;
}
while (tempB != null) {
tempB = tempB.next;
lengthB++;
}
int gap = Math.abs(lengthA - lengthB);
tempA = headA;
tempB = headB;
if (lengthA > lengthB) {
while (gap-- > 0) {
tempA = tempA.next;
}
} else {
while (gap-- > 0) {
tempB = tempB.next;
}
}
while (tempA != null) {
if (tempA == tempB) {
return tempA;
}
tempA = tempA.next;
tempB = tempB.next;
}
return null;
}
时间复杂度:O(N)