160、相交链表
题目描述
解题思路
1、要得出相交的节点值,就是要判断两条链表相交的位置
2、首先遍历两条链表
3、将pA
,pB
分别指向两条链表的头结点,并且开始往下遍历
4、假设A为长链表,B为短链表
5、我们知道,肯定会出现B链表先遍历到最后的节点,也就是指针指向null
6、当出现这种情况时,我们先将pB指向A链表的头结点,继续往下遍历
7、同时,我们也应该知道,此时长链表也会继续遍历,当它的遍历到最后的节点时,也就是指针指向null
时,我们将pA
指针指向B的头结点。
8、A,B两条链表继续遍历
9、当两条链表有相交时,输出pA
10、当没有交集时,返回null
具体的看下面图解
图解
此刻pB
指向null
,这时我们让pB
指向A长链表
的头结点
继续遍历,一直到pA
指向null
(此处过程省略,和上面一样)
将pA
指向pB
的头结点
我们可以看到,这时pA
到了B链表
的9的位置,pB
到了A链表
的4的位置,之后它们会相交
当然也有可能存在没有相交的情况,如果没有相交我们将返回null
代码
var getIntersectionNode = function(headA, headB) {
//清除高度差
//同时遍历两个链表
//一直往下遍历,会发现,短链表会先遍历完,为null,然后短链表的指针指向长链表的头指针,
//接着当,长链表遍历到最后指向null时,将长链表的指针指向短链表的头结点
//继续遍历,如果有相交,则会出现重合返回pA,否则返回null
let pA = headA;
let pB = headB;
while(pA || pB){
if(pA === pB) return pA;
pA = pA === null ? headB : pA.next;
pB = pB === null ? headA : pB.next;
}
return null;
}