【算法速刷(1/100)】LeetCode —— 160.相交链表


今天开始我要速通TOP100!                                                                        —— 沃兹基 · 硕德


目录

直观解法1

基于题目数学特性解法2

情况分析

直观解法1

求两个链表的相交节点,直觉做法就是创建一个哈希集合存储其中一条链表的节点,再遍历另一个链表去寻找第一个出现在哈希集合中的节点,不存在就返回nullptr

由此可得出代码

ListNode* getIntersectionNode(ListNode *headA, ListNode *headB) {
        unordered_set<ListNode*> cache;

        while(headA)
        {
            cache.insert(headA);
            headA = headA->next;
        }

        while(headB)
        {
            if(cache.count(headB))
                return headB;
            headB = headB->next;
        }

        return nullptr;
    }

基于题目数学特性解法2

ListNode* getIntersectionNode(ListNode *headA, ListNode *headB) {
        if(!headA || !headB)
            return nullptr;

        ListNode* pA = headA, *pB = headB;
        while(pA != pB)
        {
            pA = pA == nullptr ? headB : pA->next;
            pB = pB == nullptr ? headA : pB->next;
        }
        return pA;
    }

假设链表A到达交点需走a步,链表B到达交点需走b步,从公共交点到达末尾要走c步

那么A链表遍历完需要走a + c步,B链表需要走b + c步

此时如果A链表再走b步,B链表再走a步,双方所走步数就会相同,值得注意的是虽然我们并没有使用任何计数器去记录步数,但由于我们知道

        a代表着A链表在到达交点前的长度

        b代表着B链表在到达交点前的长度

因此只需要在双方进行遍历,走到链表尾部时,立刻将遍历指针指向对方链表头部继续遍历即可

情况分析

如果双方没有交点

        且链表长度相等:双方会在将指针指向对方头结点之前同时等于nullptr,结束循环

        且链表长度不相等:双方指针会各自完整遍历一遍两个链表,并同时指向nullptr

如果双方有交点

        且链表长度相等:双方会在第一次遍历时得到交点

        且链表长度不相等:双方会在互相遍历完自己的链表后,遍历对方链表时得到交点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值