JZ36 两个链表的第一个公共节点*

题目描述

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

方法1(使用set)

思路

利用unordered_set容器存放数据不重复的思想,将链表1的节点全都放进unordered_set容器中去,然后遍历链表2,在容器中找有没有链表2的节点,第一次找到的节点就是两个链表的第一个公共节点

代码

class Solution {
public:
    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
        unordered_set<ListNode*> s;
        ListNode* p1=pHead1;
        ListNode* p2=pHead2;
        while(p1!=NULL)
        {
            s.insert(p1);
            p1=p1->next;
        }
        //unordered_set<ListNode*>::iterator pos;
        while(p2!=NULL)
        {

            if(s.find(p2)!=s.end())
                return p2;
            p2=p2->next;
        }
        return NULL;
    }
};

方法2(快慢指针思想)

思路

  • 首先计算出两个链表的长度
  • 让长的链表指针先走差值步
  • 两个指针同时走,直到相遇(相遇时的节点即为链表的第一个公共节点)

代码

class Solution {
public:
    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
        if(pHead1==NULL||pHead2==NULL)
            return NULL;
        ListNode* p1=pHead1;
        ListNode* p2=pHead2;
        int len1=0,len2=0;
        int k=0;
        while(p1!=NULL)
        {
            len1++;
            p1=p1->next;
        }
        p1=pHead1;
        while(p2!=NULL)
        {
            len2++;
            p2=p2->next;
        }
        p2=pHead2;
        if(len1>len2)
        {
            k=len1-len2;
            while(k)
            {
                p1=p1->next;
                k--;
            }
        }
        else
        {
            k=len2-len1;
            while(k)
            {
                p2=p2->next;
                k--;
            }
        }
        while(p1!=NULL&&p2!=NULL&&p1!=p2)
        {
            p1=p1->next;
            p2=p2->next;
        }
        return p2;
        }
};

这个方法有个问题;上面代码的最后一个while我一开始是这么写的,然后就只通过了42.86,这是为什么嘞:
图片说明

全部评论

相关推荐

07-02 13:50
闽江学院 Java
点赞 评论 收藏
分享
程序员饺子:正常 我沟通了200多个 15个要简历 面试2个 全投的成都的小厂。很多看我是27直接不会了😅
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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