思路
计算两个链表的长度:使用一个辅助函数(如
getListLen
)遍历每个链表,计算它们的长度。确定较长链表:比较两个链表的长度,找出哪个链表更长。
对齐两个链表的遍历起点:让较长链表的指针先走,走的距离是两个链表长度的差值,这样两个指针就会在它们各自链表的相同位置开始遍历。这里目的是对齐指针位置,即让两个链表的末尾位置对齐
同步遍历两个链表:从对齐后的起点开始,同时遍历两个链表,直到找到交点或者两个指针都到达链表的末尾。
返回结果:如果两个链表有交点,返回交点节点;如果没有交点,返回
null
。
题目
示例代码
// 定义一个函数,用于计算链表的长度
var getListLen = function(head) {
let len = 0, cur = head; // 初始化长度为0,cur指向链表头节点
while(cur) { // 遍历链表直到cur为null
len++; // 每遍历一个节点,长度加1
cur = cur.next; // cur指向下一个节点
}
return len;
}
// 定义一个函数,用于找出两个链表的交点
var getIntersectionNode = function(headA, headB) {
// 初始化两个指针分别指向两个链表的头节点
let curA = headA, curB = headB,
lenA = getListLen(headA),
lenB = getListLen(headB);
//把较长的链表统一放在A
// 如果链表A比链表B长,则交换两个链表的指针和长度
if(lenA < lenB) {
//这里采用es6的解构赋值
[curA, curB] = [curB, curA]; // 交换两个链表的头节点
[lenA, lenB] = [lenB, lenA]; // 交换两个链表的长度
}
// 计算两个链表长度的差值
let i = lenA - lenB;
// 让curA先走i步,使得curA和curB在同一起点上(末尾位置对齐)
while(i-- > 0) {
curA = curA.next;
}
// 同时遍历两个链表,直到curA和curB相遇或者都到达链表末尾
while(curA && curA !== curB) {
curA = curA.next;
curB = curB.next;
}
// 如果curA和curB相遇,则返回交点节点;否则,返回null
return curA;
};
欢迎指正!