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

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

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

#java

@一叶浮沉 代码思路的理解+分析
ps:第一眼看去差点没看明白 跑了下是对的 然后加入了些分析 希望对别人有帮助吧!

    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        // 分析得 : 如果2个相加的链表,表头不相等  则肯定有共同尾部
        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) {
                // 判断谁先走到了头 先走到头的回来继续走
                // 相当于减去长链表比短链表长的部分 然后2个相同长度的链表从头开始遍历
                // 时间复杂度为O(2n) 比我自己写的O(n^2)复杂度的代码好很多
                if (p1 == null) {
                    p1 = pHead2;
                }
                if (p2 == null) {
                    p2 = pHead1;
                }
            }
        }
        return p1;
    }

下面是我的代码(相对好理解一些)

    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        while(pHead1 != null){
            ListNode node = pHead2;
            while(node != null){
                if(pHead1 == node){
                    return node;
                }
                node = node.next;
            }
            pHead1 = pHead1.next;
        }
        return null;
    }
全部评论
问题关键是将两个链表的长度变为一样,然后同时移动两个指针
1 回复
分享
发布于 2021-02-13 22:59
为什么pHead1 == node就可以直接返回node呢,这个条件满足仅仅是指pHead1结点和node相等还是从pHead1和node开始以后的结点都相等呢
点赞 回复
分享
发布于 2019-12-13 21:11
滴滴
校招火热招聘中
官网直投
兄弟,你对链表概念优点模糊啊,当一个节点相等后,说明这个节点后面的节点都重合了,肯定也是相等的,这就是为什么只要求第一个重合的节点了
点赞 回复
分享
发布于 2020-01-19 11:33
第一个方法如果没有公共节点的时候这两个链表就死循环了
点赞 回复
分享
发布于 2020-04-01 22:29
我跟你写的一样但是不对
点赞 回复
分享
发布于 2020-07-06 17:08
找到问题了,ListNode node = pHead2; 写的位置不对
点赞 回复
分享
发布于 2020-07-06 17:56

相关推荐

13 1 评论
分享
牛客网
牛客企业服务