思路一(哈希集合法)
(注意:空间复杂度为O(n),与题意不符合,不过也是一种思路)
将一个链表的每个节点保存在set中。遍历另一个链表,看这个链表的节点在不在set中,在就返回。遍历完未返回就说明没有公共节点,返回null。
代码
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} headA
* @param {ListNode} headB
* @return {ListNode}
*/
var getIntersectionNode = function(headA, headB) {
var set = new Set();//注意:空间复杂度O(n)
while(headA) {
set.add(headA);
headA = headA.next;
}
while(headB) {
if(set.has(headB)) return headB;
else headB = headB.next;
}
return null;
};
思路二(快慢指针法)
求出headA的长度m,求出headB的长度n。哪个链表长度长,就让他先走m-n绝对值长,然后两个指针同时走,走到的第一个公共节点即为所求值。没有公共节点的话,返回null。
代码
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} headA
* @param {ListNode} headB
* @return {ListNode}
*/
var getIntersectionNode = function(headA, headB) {//快慢指针法
var curheadA = headA;//遍历headA的指针
var curheadB = headB;//遍历headB的指针
var m = 0;//记录headA长度
var n = 0;//记录headB长度
while(curheadA) {//计算headA长度
m++;
curheadA = curheadA.next;
}
while(curheadB) {//计算headB长度
n++;
curheadB = curheadB.next;
}
curheadA = headA;
curheadB = headB;
if(m <= n) {//长度更长的链表先走abs(m-n)下
for(let j = 1; j <= n-m; j++) {
curheadB = curheadB.next;
}
}else {
for(let i = 1; i <= m-n; i++) {
curheadA =curheadA.next;
}
}
while(curheadA && curheadB) {//同时走,遇到的第一个相同的节点就是返回值
if(curheadA == curheadB) return curheadA;
else {
curheadA = curheadA.next;
curheadB = curheadB.next;
}
}
return null;//无公共节点的情况
};
思路三(双指针法,浪漫相遇)
思路参考自:图解 双指针法,浪漫相遇
我们使用两个指针curheadA,curheadB分别指向两个链表 headA,headB 的头结点,然后同时分别逐结点遍历,当 curheadA到达链表 headA 的末尾时,重新定位到链表 headB 的头结点;当 curheadB 到达链表 headB 的末尾时,重新定位到链表 headA 的头结点。
这样,当它们相遇时,所指向的结点就是第一个公共结点。
代码
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} headA
* @param {ListNode} headB
* @return {ListNode}
*/
var getIntersectionNode = function(headA, headB) {//双指针法,浪漫相遇
var curheadA = headA;//遍历headA的指针
var curheadB = headB;//遍历headB的指针
while(curheadA != curheadB) {
curheadA = curheadA == null ? headB : curheadA.next;
curheadB = curheadB == null ? headA : curheadB.next;
}
return curheadA;
};