返回

抽丝剥茧解题题解,看懂相交链表,扫清技术难点

前端

剖析相交链表,玩转链表数据结构

相交链表问题

给定两个单链表 headAheadB,寻找并返回这两个单链表的第一个相交节点。如果两个链表没有交点,则返回 null。图示两个链表在节点 c1 开始相交,并给出图解。

代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        // 检查是否为空
        if (headA == NULL || headB == NULL) {
            return NULL;
        }

        // 计算两个链表的长度
        int lenA = getLength(headA);
        int lenB = getLength(headB);

        // 调整链表,使较长的链表先走
        if (lenA > lenB) {
            int diff = lenA - lenB;
            while (diff--) {
                headA = headA->next;
            }
        } else if (lenB > lenA) {
            int diff = lenB - lenA;
            while (diff--) {
                headB = headB->next;
            }
        }

        // 同时遍历两个链表,直到找到相交节点
        while (headA != NULL && headB != NULL) {
            if (headA == headB) {
                return headA;
            }
            headA = headA->next;
            headB = headB->next;
        }

        // 如果没有找到相交节点,则返回 null
        return NULL;
    }

private:
    int getLength(ListNode *head) {
        int len = 0;
        while (head != NULL) {
            len++;
            head = head->next;
        }
        return len;
    }
};

时间复杂度和空间复杂度分析

  • 时间复杂度:O(m + n),其中 m 和 n 分别是两个链表的长度。
  • 空间复杂度:O(1),因为算法不需要额外的空间。

相关参考

结语

相交链表问题是链表数据结构中一个经典的问题,经常出现在编程面试和算法竞赛中。理解并掌握相交链表问题的解法,可以帮助您提高编程技能和算法思维。在本文中,我们介绍了相交链表问题的详细解法,包括了代码实现、时间复杂度和空间复杂度分析以及相关参考链接。希望本文能够对您有所帮助。