zoukankan      html  css  js  c++  java
  • 剑指offer系列——36.两个链表的第一个公共结点?

    Q:输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
    T:这个题的意思是两个链表要么有公共结点,要么没有公共结点,不存在相交的情况。
    A:
    1.传统做法:长的先走,直到和短的相同长度,然后两个一起走,直至相等。

        ListNode *FindFirstCommonNode(ListNode *pHead1, ListNode *pHead2) {
            if (pHead1 == nullptr || pHead2 == nullptr)
                return nullptr;
            ListNode *p1 = pHead1;
            ListNode *p2 = pHead2;
            int len1 = 0;
            int len2 = 0;
            while (p1) {
                p1 = p1->next;
                len1++;
            }
            while (p2) {
                p2 = p2->next;
                len2++;
            }
            int len3 = 0;
            p1 = pHead1;
            p2 = pHead2;
            if (len1 > len2) {
                len3 = len1 - len2;
                while (len3--)
                    p1 = p1->next;
            } else if (len2 > len1) {
                len3 = len2 - len1;
                while (len3--)
                    p2 = p2->next;
            }
            while (p1 != p2) {
                p1 = p1->next;
                p2 = p2->next;
            }
            return p1;
        }
    

    2.这种方法代码更简单。
    设第一条链表长度为(a+n),第二条链表长度为(b+n),且(a>b)(p1)(p2)同时向前走,(p2)走到结尾时,(p1)到达离结尾(a-b)处。(p2)跑到第一条链表开头,和(p1)同步前进。当(p1)走到结尾,跑到第二条链表开头,(p2)位于第一条链表(a-b)处,此时(p1)(p2)之后的链表长度相同,再可以按照上面的方法找相同结点。

    public:
       ListNode* FindFirstCommonNode(ListNode* pHead1, ListNode* pHead2) {
            ListNode* p1 = pHead1;
            ListNode* p2 = pHead2;
            while(p1 != p2) {
                if(p1 != NULL) p1 = p1->next;   
                if(p2 != NULL) p2 = p2->next;
                if(p1 != p2) {                  
                    if(p1 == NULL) p1 = pHead2;
                    if(p2 == NULL) p2 = pHead1;
                }
            }
            return p1;
    }
    

    3.上面两种情况都没考虑到有的情况。
    先判断两个是否有环,如果一个有一个没有,就肯定不会相交;如果两个都有,判断其中一个环结点是否在另一个链表中。如果不存在,那肯定不想交;如果存在,把环链接给断掉,再找相交点。
    (参考:https://blog.csdn.net/wenmin_shu/article/details/82924805)

  • 相关阅读:
    Runtime Type Information 运行时类型信息RTTI
    ADO实现单条记录的刷新
    TDataLink类说明
    编程实现文件关联
    咏南的连接池
    关系数据库系统PK面向对象数据库系统
    div+CSS编程技巧
    Hadoop编程笔记(一):Mapper及Reducer类详解
    如何统计博客园的个人博客访问量
    MapReduce编程模型:用MapReduce进行大数据分析
  • 原文地址:https://www.cnblogs.com/xym4869/p/12326549.html
Copyright © 2011-2022 走看看