剑指offer 54. 两个链表的第一个公共结点

简介: 剑指offer 54. 两个链表的第一个公共结点

题目描述

输入两个链表,找出它们的第一个公共结点。

当不存在公共节点时,返回空节点。

样例

给出两个链表如下所示:
A:        a1 → a2
                   c1 → c2 → c3
B:     b1 → b2 → b3
输出第一个公共节点c1

方法一:双指针 O(n)

这道题我们拿题目样例举例,通过找规律可以发现:


链表 A 为 a1 → a2 → c1 → c2 → c3

链表 B 为 b1 → b2 → b3 → c1 → c2 → c3


这两个链表公共的部分为 c1 → c2 → c3 ,而不是公共的部分分别是 a1 → a2 长度为 2 和 b1 → b2 → b3 长度为 3 。


所以我们只用俩指针同时去遍历链表 A 与 B ,再遍历到尽头时将两指针交换遍历链表,即两个指针都会遍历一遍 A 和 B ,只是遍历的顺序不同。


这样一来,两指针第二次到达两链表第一个公共点时,一定走的路程是相同的。第一个指针先遍历 a1 → a2 → c1 → c2 → c3 共 5 步,再遍历 b1 → b2 → b3 → c1 加起来共 9 步到达第一个公共点。而第二个指针先遍历 b1 → b2 → b3 → c1 → c2 → c3 共 6 步,再遍历 a1 → a2 → c1 加起来也是共 9 步到达第一个公共点。


由此,假设链表 A 和 B 的非公共部分长度分别为 x 和 y ,公共部分长度为 z ,则我们可以得到如下公式:


x + z + y = y + z + x


也就是两个指针遍历的步数,只要满足上述公式,就能找到第一个公共结点。当然,如果没有公共结点两指针就相当于遍历了一遍链表 A 和 B 。


02d0247be434466abec8de5477ee60fa.png

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* findFirstCommonNode(ListNode* headA, ListNode* headB) {
        ListNode* p1 = headA, * p2 = headB;
        while (p1 != p2)
        {
            if (p1)  p1 = p1->next;
            else    p1 = headB;
            if (p2)  p2 = p2->next;
            else    p2 = headA;
        }
        return p1;
    }
};


欢迎大家在评论区交流~

目录
相关文章
|
3月前
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
81 1
|
2月前
|
存储 算法 搜索推荐
链表的中间结点
【10月更文挑战第24天】链表的中间结点是链表操作中的一个重要概念,通过快慢指针法等方法可以高效地找到它。中间结点在数据分割、平衡检测、算法应用等方面都有着重要的意义。在实际编程中,理解和掌握寻找中间结点的方法对于解决链表相关问题具有重要价值。
25 1
|
4月前
链表的中间结点
链表的中间结点
183 57
|
3月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
57 0
|
3月前
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
19 0
|
5月前
|
算法
LeetCode第19题删除链表的倒数第 N 个结点
该文章介绍了 LeetCode 第 19 题删除链表的倒数第 N 个结点的解法,通过使用快慢双指针,先将快指针移动 n 步,然后快慢指针一起遍历,直到快指针到达链尾,从而找到倒数第 N 个结点的前一个结点进行删除,同时总结了快慢指针可减少链表遍历次数的特点。
LeetCode第19题删除链表的倒数第 N 个结点
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
60 5
|
5月前
【刷题记录】链表的中间结点
【刷题记录】链表的中间结点
|
7月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
7月前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表

热门文章

最新文章