链表相交
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
图示两个链表在节点 c1 开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
示例 1:
示例 2:
示例 3:
解法
对于两个相交链表,可以先将相交链表拆开为两个链表,标出相同部分。如下图所示:
在上图基础上,可以划两条线,将链表分为三部分。
- 相同部分
- 长度超出部分
- 长度相同但元素不同部分
如下图L:
所以解题思路就是,先去除长度超出部分,再去除长度相同但元素不同部分。
- 求出两个链表的长度
- 长度相减得到长度差
- 长度较长的链表从链表头开始走长度差步
- 两个链表同时向后走,直到相等或为空
- 返回相等节点
代码
var getIntersectionNode = function(headA, headB) {
if(headA === null || headB === null) {
return null
}
let nodeA = headA
let nodeB = headB
let lenA = 1
let lenB = 1
while(nodeA !== null) {
nodeA = nodeA.next
lenA++
}
while(nodeB !== null) {
nodeB = nodeB.next
lenB++
}
let difference = Math.abs(lenA - lenB)
nodeA = headA
nodeB = headB
if(lenA > lenB) {
while(difference > 0) {
nodeA = nodeA.next
difference--
}
} else {
while(difference > 0) {
nodeB = nodeB.next
difference--
}
}
while(nodeA && nodeB && nodeA !== nodeB) {
nodeA = nodeA.next
nodeB = nodeB.next
}
if(nodeA === nodeB) {
return nodeA
} else {
return null
}
};