160. 相交链表

目录

一、问题描述

二、解题思路

三、代码

四、复杂度分析


一、问题描述

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

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

二、解题思路

双指针法

核心思想:

让两个指针分别遍历两个链表,当指针走到链表末尾时,跳到另一个链表的开头。

  • 这样两人走的总路程是一样的(a + c + b + c)

  • 如果有相交节点,最终会在相交处相遇;

  • 如果没有相交节点,最终两个指针都走到 null。


步骤流程图:

假设:

  • A 长度为:a + c

  • B 长度为:b + c

  • 相交部分长度为:c

让两个指针分别从 A 和 B 开始走:

  • 第一个指针走路径:a → c → b

  • 第二个指针走路径:b → c → a

当他们第二次相遇的时候,就是相交节点

三、代码

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        // 定义两个指针 pA 和 pB,分别指向两个链表的头
        ListNode* pA = headA;
        ListNode* pB = headB;

        // 遍历两个链表
        while (pA != pB) {
            // 如果走到末尾了,就从另一个链表的头开始走
            pA = (pA == nullptr) ? headB : pA->next;
            pB = (pB == nullptr) ? headA : pB->next;
        }

        // 相遇时返回相交节点,或都为 nullptr(说明无交点)
        return pA;
    }
};

四、复杂度分析

  • 时间复杂度:O(m + n)
    每个指针最多遍历两个链表长度

  • 空间复杂度:O(1)
    没有使用额外空间

你可能感兴趣的:(LeetCode,链表,数据结构,算法,leetcode,职场和发展,c++)