Skip to content
On this page

链表相交

力扣题目链接(opens new window)

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。

图示两个链表在节点 c1 开始相交:

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构 。

示例 1:

示例 2:

示例 3:

思路

  • 用两个指针,分别遍历两个链表两次,一个指针从链表1开始,另一个指针从链表2开始,当走到null时,切换到另外一个链表头继续遍历。到最后如果能走到同个结点,说明存在相交结点。
  • 先获取两个链表的长度,先遍历掉多的部分,再两个链表同时遍历,看是否能找到相交结点。

代码

双指针

var getIntersectionNode = function(headA, headB) {
if(headA === null || headB === null){
return null;
}
let p1 = headA, p2 = headB;
while(p1 !== p2){
p1 = p1 === null ? headB : p1.next;
p2 = p2 === null ? headA : p2.next;
}
return p1;
};```

先获取长度,再模拟

```js
var getIntersectionNode = function(headA, headB) {
let lenA = getLength(headA);
let lenB = getLength(headB);
let pA = headA;
let pB = headB;
if(lenA < lenB){
[pA, pB] = [pB, pA];
[lenA, lenB] = [lenB, lenA];
}
let i = lenA - lenB;
while(i-- > 0){
pA = pA.next;
}
while(pA && pA != pB){
pA = pA.next;
pB = pB.next;
}
return pA;
};

var getLength = (head) => {