题目描述:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
图示两个链表在节点 c1 开始相交 :
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构
对应力扣142题
这道题算是数学题一点都不为过,涉及到了数学运算,判断链表是否有环我们可以使用快慢指针的方式,定义一个fast指针和slow指针,如果fast指针或者slow指针在途中相遇,说明这个链表有环,途中设计到一些推理证明,感兴趣的可以看代码随想录中讲的比较详细,代码如下
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var detectCycle = function(head) {
// 判断传入的链表是否为空
if(!head || !head.next) {
return null
}
// 初始化定义快慢指针,慢指针每次走一个节点,快指针走两个节点
var slow = head.next;
var fast = head.next.next;
// 快指针是走在前面的,如果为空则跳出循环返回null,如果没有相遇则快慢指针正常走
while(fast && fast.next && fast !== slow) {
slow = slow.next;
fast = fast.next.next;
}
if (!fast || !fast.next) return null;
// 以下是推理后得出的代码,大概就是在快慢指针相遇的时候,让快指针以正常速度往前走,而慢指针回到起点,当它们两相等的时候这个节点就是入环的节点,推理是数学知识
slow = head;
while(fast !== slow) {
fast = fast.next;
slow = slow.next;
}
return slow;
};