C++ 解决求两个链表的第一个公共结点问题

下面我将为您详细讲解C++如何解决求两个链表的第一个公共结点问题。

问题描述

给定两个单向链表的头指针head1head2,请找出它们的第一个公共结点。

解决思路

要想求两个链表的第一个公共结点,我们可以使用如下思路:

  1. 先遍历两个链表得到它们的长度len1len2。同时标记一下两个链表的尾节点是否相同。
  2. 如果两个链表的尾节点不同,则两个链表没有公共节点,直接返回nullptr
  3. 如果两个链表的尾节点相同,则让长一点的链表的头指针先向后移动len1 - len2个节点。
  4. 然后同时遍历两个链表,直到找到第一个公共节点,如果没有公共节点则返回nullptr

代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    ListNode* FindFirstCommonNode(ListNode* head1, ListNode* head2) {
        if (!head1 || !head2) {  // 其中一个链表为空则直接返回
            return nullptr;
        }
        int len1 = getListLength(head1);
        int len2 = getListLength(head2);
        ListNode *pLong, *pShort;
        int diff;
        if (len1 > len2) {  // 长短链表分别指向
            pLong = head1;
            pShort = head2;
            diff = len1 - len2;
        } else {
            pLong = head2;
            pShort = head1;
            diff = len2 - len1;
        }
        while (diff--) {
            pLong = pLong -> next;
        }
        while (pLong && pShort && pLong != pShort) {
            pLong = pLong -> next;
            pShort = pShort -> next;
        }
        return pLong;
    }
private:
    int getListLength(ListNode* head) {
        int length = 0;
        ListNode* p = head;
        while (p) {
            ++length;
            p = p -> next;
        }
        return length;
    }
};

如上所示,我们首先判断两个链表中是否有一个为空,如果有一个为空则直接返回nullptr。然后遍历两个链表得到它们的长度,并且同时标记一下它们的尾节点是否相同。如果两个链表的尾节点不同,则直接返回nullptr。如果两个链表的尾节点相同,则让长一点的链表的头指针先向后移动len1 - len2个节点,然后同时遍历两个链表,直到找到第一个公共节点,如果没有公共节点则返回nullptr

示例说明

示例1

链表1:1 -> 2 -> 3 -> 6 -> 7
链表2:4 -> 5 -> 6 -> 7

这两个链表的第一个公共节点是6。

ListNode* head1 = new ListNode(1);
head1 -> next = new ListNode(2);
head1 -> next -> next = new ListNode(3);
ListNode* p = head1 -> next -> next;
p -> next = new ListNode(6);
p -> next -> next = new ListNode(7);

ListNode* head2 = new ListNode(4);
head2 -> next = new ListNode(5);
p = head2 -> next;
p -> next = head1 -> next -> next -> next;

Solution sol;
ListNode* res = sol.FindFirstCommonNode(head1, head2);
cout << res -> val << endl;  // 输出 6

示例2

链表1:1 -> 2 -> 3
链表2:4 -> 5 -> 6 -> 7

这两个链表没有公共节点。

ListNode* head1 = new ListNode(1);
head1 -> next = new ListNode(2);
head1 -> next -> next = new ListNode(3);

ListNode* head2 = new ListNode(4);
head2 -> next = new ListNode(5);
ListNode* p = head2 -> next;
p -> next = new ListNode(6);
p = p -> next;
p -> next = new ListNode(7);

Solution sol;
ListNode* res = sol.FindFirstCommonNode(head1, head2);
cout << res << endl;  // 输出 nullptr

以上就是C++解决求两个链表的第一个公共结点问题的完整攻略,希望对您有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 解决求两个链表的第一个公共结点问题 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 详解如何在cmd命令窗口中搭建简单的python开发环境

    以下是搭建Python开发环境的完整攻略: 确认Python安装 首先需要确认电脑是否已经安装了Python。可以在cmd命令窗口中输入以下命令来查看: python –version 如果系统已经安装Python,会显示Python的版本信息。如果没有安装,则需要先到Python官网下载并安装Python。 配置环境变量 完成Python的安装后,需要配…

    other 2023年6月26日
    00
  • JavaScript 原型继承之构造函数继承

    JavaScript 原型继承之构造函数继承攻略 什么是构造函数继承 构造函数继承(也称为经典继承)是一种使用构造函数来创建对象并继承来自父类的属性和方法的方法。这种方式通过在子类的构造函数中调用父类构造函数以继承属性,然后将子类原型设置为父类实例来继承方法。 如何进行构造函数继承 在子类构造函数中,通过调用父类构造函数,来继承父类的属性: function…

    other 2023年6月27日
    00
  • win2003或linux服务器一般多久重启一次

    题目:win2003或linux服务器一般多久重启一次 为了保证服务器的稳定性和安全性,一般建议服务器定期重启。但是具体重启频率还与服务器的使用情况和运行时长有关。本文将从以下几个方面讲解win2003或linux服务器重启的攻略: 重启的目的与适当频率 重启前的准备工作 重启过程中可能出现的问题及解决方法 示例说明 其他注意事项 1. 重启的目的与适当频率…

    other 2023年6月27日
    00
  • Win10版本即将终止服务请立即重启解决方法

    Win10版本即将终止服务请立即重启解决方法 如果您在使用Windows 10操作系统时遭遇到“Win10版本即将终止服务请立即重启”的提示,那么不要惊慌,这种情况通常与系统更新有关。以下是一些可供尝试的解决方案: 方案一:重启电脑 重启电脑可能是解决这个问题最简单的方法。尝试重启电脑,看看问题是否得到解决。 方案二:检查更新 这个问题通常与Windows系…

    other 2023年6月27日
    00
  • java根据子节点获取所有的父节点

    在Java中,如何根据子节点获取所有的父节点? 解决方案 以下是根据子节点获取所有父节点的解决方案: 方案1:使用递归 可以使用递归来实现根据子获取所有父节点的功能。具体步骤如下: 定义一个方法,该方法接收一个子节点作为参数。 在方法中首先获取子节点的父节点。 如果父节点不为空,则将父节点添加到一个列表中,并递归调用该方法,将父节点作为参数传递给该方法。 如…

    other 2023年5月7日
    00
  • linux初学者-cifs网络文件系统篇

    Linux初学者-CIFS网络文件系统篇 在Linux系统中,CIFS(Common Internet File System)是一种实现网络文件共享的协议,常用于Windows和Linux之间的文件共享。CIFS使用客户端/服务器模型,将文件系统挂载到Linux系统中。本篇文章将介绍如何使用CIFS网络文件系统在Linux系统中实现文件共享。 安装CIFS…

    其他 2023年3月28日
    00
  • 魔兽世界6.0生存猎TMW字符串_生存猎打地鼠式TMW字符串一览

    魔兽世界6.0生存猎TMW字符串_生存猎打地鼠式TMW字符串一览 什么是TMW字符串 TMW(TellMeWhen)是魔兽世界中便捷的辅助插件之一,可以用于显示任务、法术或者buff等信息。其中,TMW字符串指的是把一组特定的信息匹配到特定的框架中,以实现显示的效果。 生存猎TMW字符串攻略 1. 基本概念 生存猎TMW字符串是一种打地鼠式的字符串,即在某些…

    other 2023年6月20日
    00
  • windows下文件同步工具 CwRsync 4.0.2 安装配置方法(图文)

    下面是详细的讲解“Windows下文件同步工具CwRsync 4.0.2安装配置方法”的攻略指南。 1. 下载安装包 首先我们需要下载CwRsync安装包,可以从官方网站(https://www.itefix.net/content/cwrsync-free-edition)的“Download”页面找到最新的版本。 2. 安装CwRsync 下载完成后,打…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部