zoukankan      html  css  js  c++  java
  • 两个链表的第一个公共结点

    题目描述

    输入两个链表,找出它们的第一个公共结点。
     
    解题思路:
    思路一:先遍历一个链表,将所有节点记录,再遍历另外一个遍历,当第一个节点发现重复时,此节点就是结果,否则返回空。需要借助set这样的数据结构。
    思路二:参考别人的思路。我们假设A与B有公共节点,链表A的长度为a+n,链表B的长度为b+n,且a<b,那么同时移动两个链表的指针A的p1、B的p2,当p1到达链表A尾部时,p2还需要b-a步到达B尾部,此时将A的指针p1也指向B链表的头部,然后向后走b-a步,此时p2到达B链表的尾部,p1指针在B链表的b-a位置,p2指针指向A链表头部,此时两个指针同时再走a步,p2到达了a位置,p1到达了b位置,即到达公共节点,如果不是公共节点,那么再走n步同时到达尾部。
    //思路1
    class Solution {
    public:
        ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
            set<ListNode*> filter;
            ListNode* res = NULL;
            while(pHead1 != NULL){
                filter.insert(pHead1);
                pHead1 = pHead1->next;
            }
            while(pHead2 != NULL){
                if(filter.find(pHead2) != filter.end()){
                    res = pHead2;
                    break;
                }
                pHead2 = pHead2->next;
            }
            return res;
        }
    };
    
    //思路二
    
    class Solution {
    public:
        ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
            ListNode*p1, *p2;
            p1 = pHead1;
            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;
        }
    };
    

      

     
  • 相关阅读:
    最全的 Twitter Bootstrap 开发资源清单
    jQuery布局插件UI Layout简介及使用方法
    SQLcode错误代码汇总和sqlstate=37000的解决方案
    JQUERY插件学习之jQuery UI
    如何判断/检查一个集合(List<string>)中是否有重复的元素
    反射原理及简介
    C# 获取文件夹下的所有文件的文件名
    委托编程指南
    模块封装与程序集
    Redis Lock
  • 原文地址:https://www.cnblogs.com/chengsheng/p/10678800.html
Copyright © 2011-2022 走看看