小学生都能看懂的题解 | #两个链表的第一个公共结点#

两个链表的第一个公共结点

https://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46

问题描述

假设有两条队伍,这两条队伍可能会汇合在一起。我们的任务是找到这两条队伍第一次汇合的地方。如果没有汇合的地方,我们就说这两条队伍没有交集。

解决思路

我们可以用两个小朋友来帮我们完成这个任务:

  1. 两个小朋友分别站在两条队伍的最前面
  2. 一个小朋友先走一段距离,这段距离等于两条队伍汇合前的距离差。
  3. 两个小朋友同时开始往前走,直到他们遇到对方。

如果两条队伍没有汇合的地方,那么这两个小朋友最终都会走到队伍的末尾,也就是说他们会在队伍的末尾相遇。

实现步骤

  1. 准备两个小朋友:
  2. 一个小朋友叫“小明”,他站在第一条队伍的最前面。
  3. 另一个小朋友试“小红”,她站在第二条队伍的最前面。
  4. 同时开始走:
  5. 小明和小红同时开始走。
  6. 如果小明走到队伍的末尾,他就去第二条队伍的最前面继续走。
  7. 如果小红走到队伍的末尾,她就去第一条队伍的最前面继续走。
  8. 找到汇合点:
  9. 当小明和小红相遇时,他们相遇的地方就是队伍汇合的第一地点。
  10. 如果小明和小红同时走到队伍的末尾(即都为 null),说明两条队伍没有汇合的地方。

示例代码

以下是具体的Java代码实现:

public class Solution {
    /**
     * 获取两个链表的第一个公共结点。
     * @param pHead1 第一个链表的头节点
     * @param pHead2 第二个链表的头节点
     * @return 第一个公共结点,如果没有公共结点,则返回null
     */
    public ListNode findFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        // Step 1: 小明站在第一条队伍的最前面
        ListNode xiaoming = pHead1;
        // 小红站在第二条队伍的最前面
        ListNode xiaohong = pHead2;

        // Step 2: 小明和小红同时开始走
        while (xiaoming != xiaohong) {
            // 如果小明走到队伍的末尾,他就去第二条队伍的最前面继续走
            xiaoming = xiaoming == null ? pHead2 : xiaoming.next;
            // 如果小红走到队伍的末尾,她就去第一条队伍的最前面继续走
            xiaohong = xiaohong == null ? pHead1 : xiaohong.next;
        }

        // Step 3: 小明和小红相遇的地方就是汇合的第一地点
        return xiaoming;
    }
    
}

示例解释

假设输入为 {1, 2, 3}, {4, 5}, {6, 7}

  1. 初始化指针
  2. 让“小明”指向节点 1,“小红”指向节点 4。
  3. 同时移动指针
  4. 当“小明”到达节点 3 的末尾时,将其移到节点 4 开始。
  5. 当“小红”到达节点 5 的末尾时,将其移到节点 1 开始。
  6. 找到公共节点
  7. 继续移动,最终两个指针都会到达公共节点 6。

最终输出结果为 找到的公共节点值为:6, 接下来的节点值为:7

附件说明

有同学可能有会有疑问,为什么相遇的点就是队伍交汇的点,这里需要加减法的知识。

  • a+c为队伍1的长度。
  • b+c为队伍2的长度。
  • (a+c)+(b+c)=(b+c)+(a+c)
  • (a+c)+b=(b+c)+a
  • 上面的等式的意思是,队伍1的长度+b=队伍2的长度+a

如果这篇文章对你有帮助,请点个免费的👍,让它帮助更多的人。

#牛客创作赏金赛#
小学生都能看懂的算法 文章被收录于专栏

主要面向小白的算法文章。以小学生都能看懂为目标而编写,顺便巩固下自己。

全部评论

相关推荐

05-11 11:48
河南大学 Java
程序员牛肉:我是26届的双非。目前有两段实习经历,大三上去的美团,现在来字节了,做的是国际电商的营销业务。希望我的经历对你有用。 1.好好做你的CSDN,最好是直接转微信公众号。因为这本质上是一个很好的展示自己技术热情的证据。我当时也是烂大街项目(网盘+鱼皮的一个项目)+零实习去面试美团,但是当时我的CSDN阅读量超百万,微信公众号阅读量40万。面试的时候面试官就告诉我说觉得我对技术挺有激情的。可以看看我主页的美团面试面经。 因此花点时间好好做这个知识分享,最好是单拉出来搞一个板块。各大公司都极其看中知识落地的能力。 可以看看我的简历对于博客的描述。这个帖子里面有:https://www.nowcoder.com/discuss/745348200596324352?sourceSSR=users 2.实习经历有一些东西删除了,目前看来你的产出其实很少。有些内容其实很扯淡,最好不要保留。有一些点你可能觉得很牛逼,但是面试官眼里是减分的。 你还能负责数据库表的设计?这个公司得垃圾成啥样子,才能让一个实习生介入数据库表的设计,不要写这种东西。 一个公司的财务审批系统应该是很稳定的吧?为什么你去了才有RBAC权限设计?那这个公司之前是怎么处理权限分离的?这些东西看着都有点扯淡了。 还有就是使用Redis实现轻量级的消息队列?那为什么这一块不使用专业的MQ呢?为什么要使用redis,这些一定要清楚, 就目前看来,其实你的这个实习技术还不错。不要太焦虑。就是有一些内容有点虚了。可以考虑从PR中再投一点产出
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务