剑指 Offer 52. 两个链表的第一个公共节点

题目:

输入两个链表,找出它们的第一个公共节点。
在这里插入图片描述
对于第一个样例 A和B的第一个公共节点是c1这里澄清以下什么叫公共节点并不是所谓的值相同就行了而是后面的节点都相同。
第二个样例一样

  • 请大家仔细想一下这个怎么才能做到时间O(n) 空间O(1)的做法?先不要看下边的题解,没有思考这道题的印象就不会深!!!!

  • 相信大家看到这里肯定经过了仔细思考了?不知道大家做出来没有

  • 我刚开始的没想到我也想了倒着来遍历发觉不可行就放弃了看题解了不得不说刚开始没有想到一看leetcode那个官方题解不够仔细后来自己花了个图就非常明白了, 在这我也把图画出

  • 在这如果两个链表 a与b不相交的部分长为 m b与a不相交的部分为n

  • 如果m = n 这个情况好处理就是遍历 两个指针同时遍历

  • 假设 m < n 这种情况看图

  • 在这里插入图片描述

  • 这张图就表现出他们的结果了如果我们a遍历完紧接着遍历b 当然是两个一起遍历不能分开

  • 他们的如果有相同部分一定会遍历道

  • m > n也一样 (当然如果没看懂下面又官方题解)

  • 代码

ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
    
         ListNode*pa = headA;
         ListNode*pb = headB;

         while (pa != pb){   //如果 pa遍历到null 重新遍历 pa = pb不就是上图么
             pa = pa == NULL ? headB : pa -> next;
             pb = pb == NULL ? headA : pb -> next;
         }        

         return pa;
    }
  • 官方题解

在这里插入图片描述在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值