文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-20 19:07

关注

这篇文章主要介绍“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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯