【题解】两个链表的公共节点

假设用数字相同代表公共节点,设链表A为:{1, 2, 3, 6, 7}, 链表B为:{4, 6, 7}。那么该如何求出第一个公共节点6呢。最容易想到的就是如果末尾对齐的话,两个链表从后向前遍历,遇到最后一个相同的为止。但是链表是单向的,要想将末尾对齐的话,就应该扩展两个链表。将A后面追加一个B,B后面追加一个A,这样两个链表长度都是len(A+B),末尾是对齐的了,意思就是第一个共同节点也一定是对齐的,如果存在的话。
A: 1, 2, 3, 6, 7, 4, 6, 7
B: 4, 6, 7, 1, 2, 3, 6, 7
这样做之后,两个链表同时遍历,肯定能够找到第一个相同的节点。(即使两个链表是没有公共节点的,也会在链表末尾截止)。

时间复杂度为

实际上,没有必要在代码中进行扩展。只需将一个链表的遍历指针在遍历结束的时候移动到另一个链表的开头即可。

class Solution {
public:
    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
        ListNode * p1 = pHead1, * p2 = pHead2;
        while(p1 != p2) {
            p1 = p1==NULL ? pHead2 : p1->next;
            p2 = p2==NULL ? pHead1 : p2->next;
        }
        return p1;
    }
};
全部评论

相关推荐

zzzilik:四个月实习做了3个项目不觉得很假吗,真没必要写这么多吧我感觉挑点核心的重点写一下我感觉会好点
你的简历改到第几版了
点赞 评论 收藏
分享
小万喜欢吃牛油:很多是多少,我不想被 误导了,简历没有什么大问题,如果只有几十家,投到一百多家再说吧
投递几十家公司,到现在0...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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