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

yizhihongxing

下面我将为您详细讲解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日

相关文章

  • mysql count提高方法总结

    MySQL COUNT提高方法总结 在MySQL中,使用COUNT函数可以用于统计满足特定条件的行数。然而,当处理大量数据时,COUNT操作可能会变得缓慢。下面是一些提高MySQL COUNT性能的方法的总结。 1. 使用索引 为COUNT操作的列添加索引可以显著提高查询性能。索引可以加快数据的查找速度,从而减少COUNT操作的时间。 示例1:为表中的列添加…

    other 2023年10月17日
    00
  • Blazor实现组件嵌套传递值的示例详解

    Blazor实现组件嵌套传递值的示例详解 在Blazor中,我们可以通过组件嵌套的方式来传递值。这种方式可以让我们在不同的组件之间共享数据,实现更加灵活和可复用的代码结构。下面将详细介绍如何在Blazor中实现组件嵌套传递值的示例。 示例一:父子组件传递值 在这个示例中,我们将创建一个父组件和一个子组件,通过父组件将数据传递给子组件。 首先,我们需要创建一个…

    other 2023年7月28日
    00
  • python去除字符串中的换行符

    在Python中,可以使用多种方法去除字符串中的换行符。下面是一些常用的方法: 方法一:使用replace()函数 可以使用Python内置的replace()函数来换字符串中的换行符。示例代码如下: str_with_newline = "Hello,\nWorld!" str_without_newline = str_with_ne…

    other 2023年5月8日
    00
  • 探讨:如何在ScrollView中嵌套ListView

    探讨: 如何在ScrollView中嵌套ListView 在Android开发中,有时候我们需要在一个滚动视图中嵌套另一个可滚动的列表视图。然而,直接将ListView放在ScrollView中是行不通的,因为它们都会尝试处理滚动事件,导致冲突。在本攻略中,我们将探讨如何解决这个问题,并提供两个示例说明。 方法一:使用RecyclerView替代ListVi…

    other 2023年7月28日
    00
  • JavaScript中layim之整合右键菜单的示例代码

    下面我将为你详细讲解“JavaScript中layim之整合右键菜单的示例代码”的完整攻略。 前言 layim 是一款适用于WebIM的 UI 框架,用于快速实现聊天界面。在聊天界面中,一些右键菜单的存在是非常必要的,比如选择文字、复制/粘贴、回复消息等等。本文将介绍如何在 layim 中整合右键菜单。 示例代码 layim.chat({ name: ‘田七…

    other 2023年6月27日
    00
  • 优酷帐号昵称和密码怎么修改?

    让我们来详细了解如何在优酷更改帐号昵称和密码。以下是完整的攻略过程: 1. 登录优酷帐号 首先,您需要登录到您的优酷帐号。请在您的浏览器中打开优酷官网(www.youku.com),然后单击页面右上角的 “登录” 按钮。输入您的电子邮件地址或手机号码和密码,然后单击 “登录” 按钮。 2. 打开账户设置 一旦您成功登录到您的优酷帐号,您需要进入您的有效个人资…

    other 2023年6月27日
    00
  • mysql日期类型比较方法

    MySQL中有多种日期类型,如DATE、DATETIME、TIMESTAMP等,每种日期类型都有自己的比较方法,本文将详细讲解MySQL中日期类型的比较方法及使用。 DATE类型的比较方法 DATE类型用于存储年、月、日信息,其比较方法可使用比较运算符(=、<、>、<=、>=、<>)来进行比较。下面是两个示例: 比较日期是…

    其他 2023年4月16日
    00
  • WPS怎么快速生成文件夹? WPS表格和TXT文本生成多个文件夹的教程

    WPS怎么快速生成文件夹,可以通过WPS表格和TXT文本来实现。下面我们来详细讲解如何进行操作。 使用WPS表格批量生成文件夹 打开WPS表格,新建一个空表格。 在第一行第一列输入“名称”,在第一行第二列输入“路径”。 在第二行第一列输入一个文件夹的名称(例如:文件夹1),在第二行第二列输入该文件夹的路径(例如:D:/文件夹1)。 点击第二行第一列的单元格,…

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