• 【剑指Offer-时间效率与空间效率的平衡】面试题52:两个链表的第一个公共节点


    题目描述

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

    思路

    由于数据结构是链表,若两个链表存在公共节点,则从该公共节点往后的节点也是公共节点。

    如果两个链表长度相等,则从头开始同时遍历两个链表,两个链表第一个相同的节点就是第一个公共节点。如果长度不同,不妨令第一个链表的长度len1大于第二个链表的长度len2,则先遍历长的链表len1-len2步,这样两个链表剩余的长度就相等了,此时再同时遍历两个链表,直至找到第一个公共节点。代码如下:

    /*
    struct ListNode {
    	int val;
    	struct ListNode *next;
    	ListNode(int x) :
    			val(x), next(NULL) {
    	}
    };*/
    class Solution {
    public:
        ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
            int len1 = getListLen(pHead1);
            int len2 = getListLen(pHead2);
            
            ListNode* pLong(0);
            ListNode* pShort(0);
            int delta = 0;
            if(len1>len2){
                pLong = pHead1;
                pShort = pHead2;
                delta = len1-len2;
            }else{
                pLong = pHead2;
                pShort = pHead1;
                delta = len2-len1;
            }
            
            while(delta>0){
                pLong = pLong->next;
                delta--;
            }
            
            while(pLong!=nullptr && pShort!=nullptr){
                if(pLong==pShort)
                    return pLong;
                pLong = pLong->next;
                pShort = pShort->next;
            }
            return nullptr;
        }
        
        int getListLen(ListNode* pHead){
            int len=0;
            ListNode* temp = pHead;
            while(temp!=nullptr){
                temp = temp->next;
                len++;
            }
            return len;
        }
    };
    

    总结

    有些关于链表的问题都可以使用一快一慢的两个指针来解决。

  • 相关阅读:
    Linux下Java安装与配置
    HYSPLIT模式简介及在线平台使用
    HYSPLIT模式简介及单机版使用图文教程
    有关气象类资料数据下载网址
    Excel图表编程应用大全(2):图表编程基础
    当装系统时遇到“选中的磁盘采用GPT分区形式”
    SQL函数
    Centos6.7 Redis3.2.8的主从搭建
    Centos 6.7 中 Redis-3.2.8的安装
    Mysql innodb_buffer_pool_size的研究
  • 原文地址:https://www.cnblogs.com/flix/p/12518096.html
Copyright © 2020-2023  润新知