题目:
题解:
方法一:哈希表
首先遍历链表 headA,并将链表 headA 中的每个节点加入哈希集合中。然后遍历链表 headB,对于遍历到的每个节点,判断该节点是否在哈希集合中:
-
如果当前节点不在哈希集合中,则继续遍历下一个节点;
-
如果当前节点在哈希集合中,则后面的节点都在哈希集合中,即从当前节点开始的所有节点都在两个链表的相交部分,因此在链表 headB 中遍历到的第一个在哈希集合中的节点就是两个链表相交的节点,返回该节点。
如果链表 headB 中的所有节点都不在哈希集合中,则两个链表不相交,返回 null。
function ListNode(val) {
this.val = val;
this.next = null;
}
var getIntersectionNode = function(headA, headB) {
const visited = new Set();
let temp = headA;
while (temp !== null) {
visited.add(temp);
temp = temp.next;
}
temp = headB;
while (temp !== null) {
if (visited.has(temp)) {
return temp;
}
temp = temp.next;
}
return null;
};
方法二:
求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置,如图:
此时就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点。否则循环退出返回空指针。
var getIntersectionNode = function(headA, headB) {
let len1 =0
let len2 =0
let list1 = headA
let list2 = headB
while(list1 || list2){
if(list1){
len1++;
list1 = list1.next
}
if(list2){
len2++;
list2 = list2.next
}
}
let step =0
if(len1 >len2){
step = len1-len2
for(let i=0;i<step;i++){
headA = headA.next
}
}else{
step = len2-len1
for(let i=0;i<step;i++){
headB = headB.next
}
}
while(headA){
if(headA == headB){
return headA
}else{
headA = headA.next
headB = headB.next
}
}
return null
};