代码随想录--160 相交链表

160 相交链表

解法1

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* getIntersectionNode(struct ListNode* headA, struct ListNode* headB) {
    // 初始化两个指针 ptrA 和 ptrB,分别指向链表A和链表B的头节点
    struct ListNode *ptrA = NULL, *ptrB = NULL;
    ptrA = headA, ptrB = headB;

    // 定义两个整数 LenA 和 LenB,用于存储链表A和链表B的长度
    int LenA = 0, LenB = 0, gap = 0;

    // 计算链表A的长度
    while (ptrA) {
        LenA++;            // 增加链表A的长度计数
        ptrA = ptrA->next; // 移动指针到下一个节点
    }

    // 计算链表B的长度
    while (ptrB) {
        LenB++;            // 增加链表B的长度计数
        ptrB = ptrB->next; // 移动指针到下一个节点
    }

    // 计算两个链表的长度差并设置 gap
    if (LenA > LenB) {
        // 如果链表A更长,指针 ptrA 继续指向链表A的头节点,ptrB 指向链表B的头节点
        ptrA = headA;
        ptrB = headB;
        gap = LenA - LenB; // 计算长度差
    } else {
        // 如果链表B更长,指针 ptrA 继续指向链表B的头节点,ptrB 指向链表A的头节点
        ptrA = headB;
        ptrB = headA;
        gap = LenB - LenA; // 计算长度差
    }

    // 通过移动 ptrA,保证两个链表的尾部对齐
    // 将较长链表的指针向前移动 gap 步,以便从对齐位置开始同时遍历两个链表
    while (gap--) {
        if (ptrA == NULL)
            return NULL; // 如果 ptrA 为 NULL,说明链表已经到达末尾,直接返回 NULL
        ptrA = ptrA->next; // 移动 ptrA 指针
    }

    // 同时遍历两个链表,查找是否存在交点
    while (ptrA) {
        if (ptrA == ptrB) {
            return ptrA; // 找到交点,返回交点节点
        } else {
            ptrA = ptrA->next; // 如果当前节点不相同,继续向后移动指针
            ptrB = ptrB->next; // 同样移动链表B的指针
        }
    }

    return NULL; // 没有交点,返回 NULL
}

解法2

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 struct ListNode* getIntersectionNode(struct ListNode* headA, struct ListNode* headB) {
    if (!headA || !headB) return NULL; // 如果其中一个链表为空,直接返回NULL

    struct ListNode *ptrA = headA, *ptrB = headB;

    // 同时遍历两个链表,一旦指针相遇就返回交点
    while (ptrA != ptrB) {
        // 如果指针到达链表A的末尾,就从链表B的头节点开始遍历
        ptrA = ptrA ? ptrA->next : headB;
        
        // 如果指针到达链表B的末尾,就从链表A的头节点开始遍历
        ptrB = ptrB ? ptrB->next : headA;
    }

    // 当ptrA == ptrB时,两个指针要么指向交点,要么都为NULL
    return ptrA;
}

你可能感兴趣的:(LeetCode,链表,数据结构)