我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++怎么求两个链表的交点

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++怎么求两个链表的交点

这篇文章主要介绍“C++怎么求两个链表的交点”,在日常操作中,相信很多人在C++怎么求两个链表的交点问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++怎么求两个链表的交点”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

求两个链表的交点

这道求两个链表的交点题要求执行时间为 O(n),则不能利用类似冒泡法原理去暴力查找相同点,事实证明如果链表很长的话,那样的方法效率很低。我也想到会不会是像之前删除重复元素的题一样需要用两个指针来遍历,可是想了好久也没想出来怎么弄。无奈上网搜大神们的解法,发觉其实解法很简单,因为如果两个链长度相同的话,那么对应的一个个比下去就能找到,所以只需要把长链表变短即可。具体算法为:分别遍历两个链表,得到分别对应的长度。然后求长度的差值,把较长的那个链表向后移动这个差值的个数,然后一一比较即可。代码如下: 

C++ 解法一:

class Solution {public:    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {        if (!headA || !headB) return NULL;        int lenA = getLength(headA), lenB = getLength(headB);        if (lenA < lenB) {            for (int i = 0; i < lenB - lenA; ++i) headB = headB->next;        } else {            for (int i = 0; i < lenA - lenB; ++i) headA = headA->next;        }        while (headA && headB && headA != headB) {            headA = headA->next;            headB = headB->next;        }        return (headA && headB) ? headA : NULL;    }    int getLength(ListNode* head) {        int cnt = 0;        while (head) {            ++cnt;            head = head->next;        }        return cnt;    }};

Java 解法一:

public class Solution {    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {        if (headA == null || headB == null) return null;        int lenA = getLength(headA), lenB = getLength(headB);        if (lenA > lenB) {            for (int i = 0; i < lenA - lenB; ++i) headA = headA.next;        } else {            for (int i = 0; i < lenB - lenA; ++i) headB = headB.next;        }        while (headA != null && headB != null && headA != headB) {            headA = headA.next;            headB = headB.next;        }        return (headA != null && headB != null) ? headA : null;    }    public int getLength(ListNode head) {        int cnt = 0;        while (head != null) {            ++cnt;            head = head.next;        }        return cnt;    }}

这道题还有一种特别巧妙的方法,虽然题目中强调了链表中不存在环,但是我们可以用环的思想来做,我们让两条链表分别从各自的开头开始往后遍历,当其中一条遍历到末尾时,我们跳到另一个条链表的开头继续遍历。两个指针最终会相等,而且只有两种情况,一种情况是在交点处相遇,另一种情况是在各自的末尾的空节点处相等。为什么一定会相等呢,因为两个指针走过的路程相同,是两个链表的长度之和,所以一定会相等。这个思路真的很巧妙,而且更重要的是代码写起来特别的简洁,参见代码如下:

C++ 解法二:

class Solution {public:    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {        if (!headA || !headB) return NULL;        ListNode *a = headA, *b = headB;        while (a != b) {            a = a ? a->next : headB;            b = b ? b->next : headA;        }        return a;    }};

Java 解法二:

public class Solution {    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {        if (headA == null || headB == null) return null;        ListNode a = headA, b = headB;        while (a != b) {            a = (a != null) ? a.next : headB;            b = (b != null) ? b.next : headA;        }        return a;    }}

到此,关于“C++怎么求两个链表的交点”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++怎么求两个链表的交点

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++怎么求两个链表的交点

这篇文章主要介绍“C++怎么求两个链表的交点”,在日常操作中,相信很多人在C++怎么求两个链表的交点问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++怎么求两个链表的交点”的疑惑有所帮助!接下来,请跟着小编
2023-06-20

java怎么判断两个链表是否相交

判断两个链表是否相交的方法可以使用双指针的方式。具体步骤如下:定义两个指针p1和p2,分别指向链表1和链表2的头节点。同时遍历链表1和链表2,如果p1和p2指向的节点相同,则说明两个链表相交,返回true。如果遍历完链表1和链表2都没有
2023-10-22

C++怎么合并两个排序的链表

本篇内容主要讲解“C++怎么合并两个排序的链表”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++怎么合并两个排序的链表”吧!题目描述:输入两个递增的链表,单个链表的长度为n,合并这两个链表并使
2023-06-22

Java中怎么利用双链表互相交换任意两个节点

这篇文章给大家介绍Java中怎么利用双链表互相交换任意两个节点,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。概述:双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双
2023-05-30

python求两个链表组成的数字的和

给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。 你可以假设除了数字 0 之外,这两个数字都不会以零开头。示例: 输入:(2 -> 4 -> 3) + (5 -> 6 ->
2023-01-30

Python中怎么求两个数组的交集

Python中怎么求两个数组的交集,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。题目:给定两个数组,编写一个函数来计算它们的交集。示例 1:输入: nums1 = [1,2
2023-06-02

Mysql怎么同时交换两个表的表名

Mysql怎么同时交换两个表的表名,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Mysql同时交换两个表的表名表重命名有两种方式,所以交换两表名也有两种方式:1
2023-06-29

sql怎么查询两个表的交集

要查询两个表的交集,你可以使用SQL的INNER JOIN操作符。以下是一个示例:```sqlSELECT table1.column1, table2.column2FROM table1INNER JOIN table2ON table
2023-09-05

C语言怎么交换两个数的值

本文小编为大家详细介绍“C语言怎么交换两个数的值”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言怎么交换两个数的值”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。使用临时变量以下实例演示了交换两个浮点数的值。
2023-06-17

Golang判断两个链表是否相交的方法详解

这篇文章主要为大家详细介绍了如何通过Golang判断两个链表是否相交,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
2023-03-14

如何用c语言求两个字符串的交集

这期内容当中小编将会给大家带来有关如何用c语言求两个字符串的交集,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。求两个字符串的交集,看似简单,实则需要考虑的细节很多。我的思路:1.将两个字符串简化,将里面重
2023-06-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录