链表-环形链表

91 阅读1分钟

题目描述:给你两个单链表的头节点 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;
};