题解 | #两个链表的第一个公共结点#
两个链表的第一个公共结点
http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46
如果链表A和B有一个为空,两者无法相交,返回null。 都不为空时,创建p1和p2分别指向A和B的头节点。p1和p2不相等就移动p1,p2遍历两个链表。
当p1走到尾指向null,p2指向c3时,将p1移动到链表B的头节点。
p1往前走到b2,同时p2走到未指向null,将p2移动链表A的头节点。
变成这样: 同时再移动下一个节点就能找到相交节点
这样做的原因是让两个指针移动的步长相等,步长相等,如果有相交的节点,就可以同时到达,跳出循环,返回p1或p2 如果没有相交的节点,两个指针会遍历完两个链表,都会指向null,返回,符合题意。
/*function ListNode(x){
this.val = x;
this.next = null;
}*/
function FindFirstCommonNode(pHead1, pHead2)
{
// write code here
if(!pHead1 || !pHead2) return null;
let p1 = pHead1;
let p2 = pHead2;
while(p1 !== p2){
if(p1 == null){
p1 = pHead2;
}else{
p1 = p1.next;
}
if(p2 == null){
p2 = pHead1;
}else{
p2 = p2.next;
}
}
return p1;
}
module.exports = {
FindFirstCommonNode : FindFirstCommonNode
};