剑指offer打卡day06:两个链表的第一个公共节点

题1:两个链表的第一个公共节点

题目描述

输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)

说明:本题目包含复杂数据结构ListNode,点此查看相关信息

解析:

参考:剑指Offer面试题:31.两个链表的第一个公共节点

牛客网:廿半

针对两个链表,主要存在长度差的变量,可以运用双指针法,来统一两个链表的长度。

  • 双指针法:

创建两个指针p1和p2,分别指向两个链表的头结点,然后依次往后遍历。

如果某个指针到达末尾,则将该指针指向另一个链表的头结点;如果两个指针所指的节点相同,则循环结束,返回当前指针指向的节点。

比如两个链表分别为:

  • 1->3->4->5->6
  • 2->7->8->9->5->6

短链表的指针p1会先到达尾部,然后重新指向长链表头部;当长链表的指针p2到达尾部时,重新指向短链表头部,此时p1在长链表中已经多走了k步(k为两个链表的长度差值),p1和p2位于同一起跑线,往后继续遍历即可:

  • 如果存在公共节点则返回公共节点
  • 如果不存在则(null == null)停止遍历,返回null

其实该方法主要就是用链表循环的方式替代了长链表指针先走k步这一步骤。

解答:

public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
    if (pHead1 == null || pHead2 == null) {
        return null;
    }
    ListNode p1 = pHead1;
    ListNode p2 = pHead2;
    while (p1 != p2) {
        p1 = p1.next;
        p2 = p2.next;
        if (p1 != p2) {
            if (p1 == null) {
                p1 = pHead2;
            }
            if (p2 == null) {
                p2 = pHead1;
            }
        }
    }
    return p1;
}

一直封装一个链表头节点的方法拼接,后来发现直接node.next增加上去即可。不过也熟悉了链表的操作,不亏。继续复习吧。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值