【剑指offer】两个链表的第一个公共结点

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

http://www.nowcoder.com/questionTerminal/6ab1d9a29e88450685099d45c9e31e46

双指针法。创建两个指针p1和p2,分别指向两个链表的头结点,然后依次往后遍历。如果某个指针到达末尾,则将该指针指向另一个链表的头结点;如果两个指针所指的节点相同,则循环结束,返回当前指针指向的节点。比如两个链表分别为:1->3->4->5->6和2->7->8->9->5->6。短链表的指针p1会先到达尾部,然后重新指向长链表头部,当长链表的指针p2到达尾部时,重新指向短链表头部,此时p1在长链表中已经多走了k步(k为两个链表的长度差值),p1和p2位于同一起跑线,往后遍历找到相同节点即可。其实该方法主要就是用链表循环的方式替代了长链表指针先走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 == null ? pHead2 : p1.next;
        p2 = p2 == null ? pHead1 : p2.next;
    }
    return p1;
}
全部评论
看到你这终于看懂这种做法了,其他总是有些什么ifelse乱七八糟的描述
4 回复 分享
发布于 2020-01-07 16:37
假如没有交点的话那不就是无限死循环的
1 回复 分享
发布于 2020-05-31 20:14
太妙了,我想的是最简单的方法找到等长的位置的,还是没有仔细思考其中的规律,女少口阿
点赞 回复 分享
发布于 2020-07-07 13:52
简洁!舒服!
点赞 回复 分享
发布于 2020-09-15 20:52
如果两个链表等长,而且相同的节点并不在同一下标的话,是会出现死循环的。
点赞 回复 分享
发布于 2021-03-24 01:34
这个写的很清楚~比上面的清晰很多,感谢
点赞 回复 分享
发布于 2021-04-23 11:29
我想问题目的意思难道是公共结点都是放在两个链表的最后吗?还是说公共结点放在两个链表的任意位置?
点赞 回复 分享
发布于 2021-07-30 22:21

相关推荐

M_bao:换个排版吧哥们,看着费劲
点赞 评论 收藏
分享
评论
55
14
分享
牛客网
牛客企业服务