首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我已经使用stack (stl)来寻找两个链表的交点,但是我得到了分段错误,下面是我的函数,

这是一个寻找两个链表交点的函数,但是在使用stack (stl)时出现了分段错误。首先,让我们来看一下这个函数的代码:

代码语言:txt
复制
#include <iostream>
#include <stack>
using namespace std;

struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(NULL) {}
};

ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
    stack<ListNode*> stackA;
    stack<ListNode*> stackB;

    ListNode* currA = headA;
    ListNode* currB = headB;

    while (currA != NULL) {
        stackA.push(currA);
        currA = currA->next;
    }

    while (currB != NULL) {
        stackB.push(currB);
        currB = currB->next;
    }

    ListNode* intersectionNode = NULL;

    while (!stackA.empty() && !stackB.empty() && stackA.top() == stackB.top()) {
        intersectionNode = stackA.top();
        stackA.pop();
        stackB.pop();
    }

    return intersectionNode;
}

int main() {
    // Test case
    ListNode* headA = new ListNode(1);
    headA->next = new ListNode(2);
    headA->next->next = new ListNode(3);
    headA->next->next->next = new ListNode(4);
    headA->next->next->next->next = new ListNode(5);

    ListNode* headB = new ListNode(6);
    headB->next = new ListNode(7);
    headB->next->next = headA->next->next;

    ListNode* intersection = getIntersectionNode(headA, headB);

    if (intersection != NULL) {
        cout << "Intersection found at node with value: " << intersection->val << endl;
    } else {
        cout << "No intersection found." << endl;
    }

    return 0;
}

这个函数使用了两个栈 stackAstackB 来分别存储链表 headAheadB 中的节点。然后,它通过比较栈顶元素找到两个链表的交点。如果栈顶元素相同,则将其赋值给 intersectionNode,并将两个栈的栈顶元素弹出。最后,返回 intersectionNode

然而,这个函数的实现存在一些问题。首先,它使用了额外的空间来存储两个链表的节点,这样会增加空间复杂度。其次,它没有考虑到链表可能存在环的情况,因此在处理带环链表时可能会出现问题。最后,它的时间复杂度为 O(n+m),其中 n 和 m 分别是两个链表的长度,这样的实现并不高效。

为了解决这些问题,我们可以使用双指针法来寻找两个链表的交点。具体步骤如下:

  1. 初始化两个指针 pApB 分别指向链表 headAheadB 的头节点。
  2. pA 不等于 pB 时,将 pApB 分别向后移动一个节点。
  3. 如果 pApB 都为空,则说明两个链表没有交点,返回 NULL
  4. 如果 pA 为空,则将 pA 指向链表 headB 的头节点。
  5. 如果 pB 为空,则将 pB 指向链表 headA 的头节点。
  6. 重复步骤 2 和步骤 3,直到找到交点或者两个指针都为空。

下面是使用双指针法实现的修改后的函数代码:

代码语言:txt
复制
ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
    ListNode* pA = headA;
    ListNode* pB = headB;

    while (pA != pB) {
        pA = (pA == NULL) ? headB : pA->next;
        pB = (pB == NULL) ? headA : pB->next;
    }

    return pA;
}

这个修改后的函数不再使用栈,而是使用两个指针 pApB 来遍历链表。它通过比较指针的值来判断是否找到交点,而不是比较栈顶元素。这样可以减少空间复杂度,并且可以处理带环链表的情况。时间复杂度为 O(n+m),空间复杂度为 O(1)。

推荐的腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):提供弹性计算能力,满足各种业务需求。产品介绍链接
  • 腾讯云云数据库 MySQL 版:提供高性能、可扩展的 MySQL 数据库服务。产品介绍链接
  • 腾讯云人工智能平台(AI Lab):提供丰富的人工智能服务和开发工具,帮助开发者构建智能应用。产品介绍链接
  • 腾讯云物联网平台(IoT Hub):提供全面的物联网解决方案,帮助连接和管理物联网设备。产品介绍链接
  • 腾讯云移动应用开发平台(MADP):提供一站式移动应用开发和运营服务,帮助开发者快速构建高质量的移动应用。产品介绍链接
  • 腾讯云对象存储(COS):提供安全、可靠、低成本的云端存储服务,适用于各种数据存储需求。产品介绍链接
  • 腾讯云区块链服务(BCS):提供一站式区块链解决方案,帮助企业快速搭建和管理区块链网络。产品介绍链接
  • 腾讯云虚拟专用网络(VPC):提供安全、灵活的云上网络环境,帮助用户构建自定义的网络拓扑。产品介绍链接
  • 腾讯云安全加速(DDoS 高防 IP):提供强大的 DDoS 防护能力,保护业务免受网络攻击。产品介绍链接
  • 腾讯云音视频处理(VOD):提供音视频上传、转码、加密、播放等功能,满足多媒体处理需求。产品介绍链接

希望以上信息能对您有所帮助!如果您还有其他问题,请随时提问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

《逆袭进大厂》第四弹之C++重头戏STL30问30答

大家好,阿秀。 这是《逆袭进大厂》系列第四期,本期 C++ 重头戏,也就是标准模板库 STL 内容,本期 24098 个字。...按照阿秀自己经历过三十多场校招面试来看,校招 C++ 岗区分度比较高两个知识点就是虚函数STL知识。...说人话就是虚函数STL部分答得好一点,面试评级就好一点,最后拿到好offer希望就大一些。 你懂意思叭?四字概括就是"钱多,速来"!...记住前三个: 线性探测 使用hash函数计算出位置如果已经有元素占用了,则向后依次寻找,找到表尾则回到表头,直到找到一个空位 开链 每个表格维护一个list,如果hash函数计算出格子相同,则按顺序存在这个...list中 再散列 发生冲突时使用另一种hash函数再计算一个地址,直到不冲突 二次探测 使用hash函数计算出位置如果已经有元素占用了,按照、、…步长依次寻找,如果步长随机数序列,则称之为伪随机探测

1.5K20

C++ 顺序容器基础知识总结

0.前言 本文简单地总结了STL顺序容器知识点。文中并不涉及具体实现技巧,对于细节东西也没有提及。一不同标准库有着不同实现,二关于具体实现《STL源码剖析》已经展示全面细致。...与其他容器相似,array也有自己迭代器,因此array能够更好地与标准算法库结合起来。 通过array::swap函数,可以实现线性时间内两个数组内容交换。...deque示意图如下: ? 现在问题来了:如果deque以数组实现,如何做到在头部常数时间插入?如果采用链表实现,又如何做到快速随机访问?deque内部数据结构到底如何?...想必你已经到了,要实现如上需求,需要由一段一段连续空间链接起来数据结构才能满足。 6.2.内存分配策略 接着上面讲。...deque复杂迭代器架构,构建出了所有分段连续空间”整体连续“假象。 既然deque由一段一段定长连续空间所构成,就需要有结构管理这些连续空间。

1.3K50

【二叉树进阶】二叉树经典面试题——最近公共祖先问题

再看一种情况 5和4公共祖先是谁啊? 我们可能会认为3,但是题目说了,一个节点也可以是它自己祖先,所以应该是5。 那了解了题目的意思,我们分析一下解题思路。...1.2 链表相交问题讲解 那有做过链表相交问题回顾一下,没做过思考一下,链表相交问题,可以怎么去找第一个交点 那在这里提供两种思路。...那想要效率高一点,第二种解法: 首先遍历两个链表找尾,判断两个链表尾结点是否相同,不相同,那就肯定不相交,直接返回false。 如果相交的话,去找相交点,怎么找呢?...计算出两个链表长度差值gap,然后让长那个链表先走gap步,然后两个链表一块走,每走一步,判断两个结点是否相同,第一个相同结点就是第一个交点。...因为不再需要使用那个函数(O(N))去判断了 2.2 AC代码 那代码也很简单,把上一题那个拷贝过来,简单修改一下就行了 这次效率明显就高了。 3.

11610

C语言栈实现

因为方便:试想一下我们要判断栈是否空就只需要判断top是否等于buttom,如果buttom指向栈底显然就会麻烦许多 下面我们先用C语言实现一下: 首先我们需要对这个装东西“盒子”定义,而这个盒子就是栈...*buttom; }; 这样完全行得通,但是你会发现在后面的代码抽象时会很难以理解 这里可以多引入之前链表例子,不过你完全可以跳过,还及链表吗?...head->next这样code,而且我们没有把链表和节点概念分开,我们始终认为链表由节点组成,而栈我们认为他一个概念,然后节点可以放在里面(不过实际上代码一个概念,只是形象用了两个结构体表示...,如果用数组储存就会遇到 结构创建完成我们需要创建一个空栈,前面我们已经说了要想让栈为空只需要top=buttom,于是你可能很容易写出现下面代码 struct stack *create_stack(...这里有一篇关于STL STACK讨论文章有兴趣可以去看看http://blog.csdn.net/housisong/article/details/505254

3.8K40

三十分钟掌握STL

原名《using stl》,不知道谁写。不过倒觉得很有趣,所以化了两个晚上把它翻译出来。没有对翻译出来内容校验过。如果你没法在三十分钟内觉得有所收获,那么赶紧扔了它。文中我省略了很多东西。...find()函数返回和前两个参数相同类型迭代器,这儿一个指向整数指针ip。 提示 必须记住STL使用模板。因此,STL函数自动根据它们使用数据类型构造。...在VC中测试出错,正确含义result成为常量而不是它指向对象不允许改变,如同int *const p;看来这作者自己也不懂』 使用迭代器编程 你已经到了迭代器一些例子,现在我们将关注每种特定迭代器如何使用...总结:使用标准模板库 (STL) 尽管很多程序员仍然在使用标准C函数但是这就好像骑着毛驴寻找Mercedes一样。你当然最终也会到达目标,但是你浪费了很多时间。...尽管有时候使用标准C函数确实方便(如使用sprintf()进行格式化输出)。但是C函数使用异常机制报告错误,也不适合处理新数据类型。

2.1K80

结合源码浅谈栈和队列

栈和队列我们日常使用频率非常高数据结构,广泛应用在各种问题和场景当中。并且它们原理相对来说比较简单,并且有一定相似之处,所以合并到一起介绍。 栈 栈,英文stack。...这里建议可以直接阅读STL源码,虽然使用了模板类以及一些宏,但整体上不影响我们阅读逻辑。...常用C++ STLstack基于deque实现,不论deque还是vector都提供push_back(), pop_back(), back(), size()等函数,因此我们可以直接调用,...我们可以参考一下下图,不过下图基于链表实现,队列实现方式并不仅仅只有链表,但的确使用链表更加适合。 普通队列只能在队尾插入元素,队首弹出元素。所以先进入队列元素也先出队列,这被称作先进先出。...也因此,队列同样容器适配器,而非容器。 这两个数据结构在算法当中应用非常广泛,但很多书本上介绍却很浅薄,个人认为这不太合适。

39030

链表存在环问题说起

,可以额外使用一个 HashSet 记录节点,如果存在过,就找到节点了,这种方式空间复杂度 O(n)。...有了前面的铺垫,下面讨论最复杂问题。 假如说,链表成环和链表相交一起出现,即分别有两个链表,它们可能成环,也可能相交,还可能既成环、又相交。现在,怎样判断它们是否成环,如果成环,环入口在哪里?...可是,这个图,错地方就在于,我们已经讨论过了,在环上无法分叉出去,即 X 点不可能存在两个链表都成环 这时,这个问题就比较有意思了,下面我们按照相交点出现位置分别讨论。...如果在遍历到环入口以前,找到了两个链表相交节点,那么我们遇到了情况一,相交节点先于成环节点出现: 反之,如果遍历到环入口时,依然没有发现相交节点,那么存在下面所述情况二、三和四: 情况二,成环且不相交...因为前面已经介绍了,相交就意味着一旦有环,这个环就是两个链表共用,因此这个环入口一旦出现,就意味着一个链表连上了另一个链表环,也就意味着相交点也出现了。

36920

模拟实现stack && queuedequeue适配器优先级队列仿函数

⭐前言:学习C++STL,我们不仅仅要要求自己能够熟练地使用上层语法,我们还必须要求自己了解其底层原理,不需要了解太深入,但一定得知道我们写出各种代码后面,究竟采用了哪种设计思想,为什么要这样设计...使用适配器模式模拟实现stack 数据结构中栈,可以通过顺序表,也能通过链表实现,不过大多数情况,都会使用顺序表实现,但是STL中,不管哪种方法,我们都可以兼顾,那就是通过类模板即可。...数据结构中队列,可以通过顺序表,也能通过链表实现,不过大多数情况,都会使用链表实现,一样地,我们可以通过类模板兼顾各种情况。...但是STL中对stack和queue默认选择deque作为其底层容器,主要是因为: ①stack和queue不需要遍历(因此stack和queue没有迭代器),只需要在固定一端或者两端进行操作。...函数对象可以像函数一样去使用。仿函数类要求重载一个函数:operator()() 下面就来实现一下,priority_queue中仿函数:less和greater。

30330

熟练使用STL标准库每个C++程序员必备技能!_舞蹈基础教学视频

目录 入坑rc车又来写文啦ヾ(≧▽≦*)o 首先,咱们搞清楚STL啥东西 One.快速排序(Sort): 1.Sort基本用法: 2.Sort进阶用法(CMP): 3.Sort对结构体...---- 入坑rc车又来写文啦ヾ(≧▽≦*)o 要“深入探讨”可以加我qq28562939 想必经常搞C++的人大概都听说过STL库吧(正好最近在研究),其中最知名就是我们——sort快速排序了...比如说中sort函数、中string类都 STL内容。...1.Sort基本用法: sortSTL自带系统函数,它格式: void sort(要排序元素起始地址,要排序元素结束地址,比较函数); 这里可以省略比较函数,他默认从小到大排序(升序排序...stack st; if(st.empty())//如果空那么执行下面代码 ...... .push(啥啥啥),在栈顶增加元素。 .top(),返回栈顶元素,记住返回,要单独输出。

35820

STL库基础学习

4)set和map 3.几种STL 时间复杂度比较 ---- 1.什么STL库 ◦ STL 又称为标准模板库,一套功能强大 C++ 模板类,提供了通用模板类和函数,这些模板类和函数可以实现多种流行和常用算法和数据结构...中功能, STL 可以很大程度上减轻你工作量,并且内置异常处理可以让你更清楚看到你所犯下错误。...2.几种常见STL模板 ◦ 现在,介绍 STL 中常用一些模板类 (vector, list, queue, stack, set, map)。...3.能够感知内存分配器(Allocator-aware) ◦ 容器使用一个内存分配器对象动态地处理它存储需求。...,但是从底层实现上来看,他本质一个双向链表,不支持随机去访问当中元素,但是在插入,删除元素时间复杂度上远低于 vector 类模板 ◦ 常用函数与 vector 当中部分相似或相等,这里不逐一介绍

83740

【C++】开散列哈希表封装实现unordered_map和unordered_set

数据集合{1, 7, 6, 4, 5, 9} 在下面的哈希表中插入一个31,则其映射位置1,但是1位置已经有元素1了,此时就会发生哈希冲突,那就需要向后找空位置插入31,这就是闭散列。...闭散列解决方式即为通过哈希函数求出key对应映射位置后,如果自己映射位置已存在元素,则线性探测向后寻找位置进行插入,比如下面的21映射位置应该是1,但是1号位有元素1了,那21只能向后探测为空位置进行插入...(兄弟们,这样解决方式错误,因为如果这么干了,比如一片哈希冲突,删除中间某个元素之后,后面的冲突元素就找不到了,因为我们认为冲突元素之间一定是连续,不能出现empty,delete状态出现就是为了应对这样情况...下面图只是想说明一下哈希桶逻辑结构和扩容之后缓解哈希冲突场景,但实际在插入节点时并不是像我下面那样对单链表进行尾插,因为尾插还需要找尾,那就需要遍历桶,这样效率太低,并且桶中也不要求次序什么...并且支持普通迭代器构造const迭代器操作,实际上STL所有容器在实现迭代器时候,都会用下面的方式支持普通迭代器构造const迭代器,如果普通迭代器调用,那这里就是普通和普通之间拷贝,没啥用因为编译器也支持这样操作

1.6K30

三十分钟掌握STL

原名《using stl》,不知道谁写。不过倒觉得很有趣,所以化了两个晚上把它翻译出来。没有对翻译出来内容校验过。如果你没法在三十分钟内觉得有所收获,那么赶紧扔了它。文中我省略了很多东西。...find()函数返回和前两个参数相同类型迭代器,这儿一个指向整数指针ip。 提示 必须记住STL使用模板。因此,STL函数自动根据它们使用数据类型构造。...在VC中测试出错,正确含义result成为常量而不是它指向对象不允许改变,如同int *const p;看来这作者自己也不懂』 使用迭代器编程 你已经到了迭代器一些例子,现在我们将关注每种特定迭代器如何使用...总结:使用标准模板库 (STL) 尽管很多程序员仍然在使用标准C函数但是这就好像骑着毛驴寻找Mercedes一样。你当然最终也会到达目标,但是你浪费了很多时间。...尽管有时候使用标准C函数确实方便(如使用sprintf()进行格式化输出)。但是C函数使用异常机制报告错误,也不适合处理新数据类型。

1.2K40

(修订)斩获腾讯微信后台开发offer大神近1.5W字面试干货分享

)一定要看看《深度探索CPP对象模型》这本书,stack overflow上有一个帖子深度讨论了类多态、虚继承这些,讲到了构造析构过程中vptr变化,然后可以自己去适当理解为什么虚函数具体调用依赖于构造析构的当前进度...SGI STL库源码阅读一遍,就算源码没有看过,STL还是会熟练使用,重点在set/map、string/vector,要是能自己写一写就最好了,很喜欢侯捷先生两句话:“源码之下,了无秘密”,“天下大事...Q:嗯,大致这个意思 如何在共享内存上使用stl标准库 Q:假设现在开辟了一片共享内存,然后想在这块共享内存上使用stl库,该怎么做呢 A:假设两个进程A和B,它们使用相同共享库,(画了一下进程内存布局...红黑树根据黑高实现每个节点左右两颗子树高度相差低于2倍,虽然红黑树平衡性没有AVL树严格,但是研究好像表明红黑树性能更好而且这个平衡度已经足够了。...当时以为两个人面,然后敲门,他让等一下。在门外听见他们一直在讨论数据结构与算法问题…当时很慌,虽然不是很怕,但是在这种让人紧张环境下迅速把算法题做出来还是有些担心。

1.8K40

异常处理第二讲,结构化异常(微软未公开)

可以看出,这个地方存放异常地方,那么我们现在再次进入后面的结构体 注意,后面这个结构体,未公开,也就是微软不让我们自己用.但是使用WinDbg解析符号我们得到了,或者我们去MSDN上搜索一下,...因为未公开,所以只知道返回值是什么意思, 第一个代表,不处理,继续执行(这个筛选器异常已经讲过了) 第二个已经处理了....我们在上面找到只是返回值,但是下面寻找时候,我们发现,使用的上面typedef定义结构体 用来定义这个Handler了....关于注册,关于注册,我们下面细讲,但是现在我们先熟悉一下段寄存器FS使用 三丶熟悉段寄存器使用,创建反调试程序 还记得我们上次,也就是第一次dt时候,花了两个框吗,我们看到了一个PEB PEB就是和进程相关...那么我们开始注册一个异常处理 注册意思:          我们上面第二步已经把异常处理链表找出了了,我们也知道了第二个参数函数指针.

93670

C++ stl_stl函数

STL(Standard Template Library,标准模板库),惠普实验室开发一系列软件统称。现在主要出现在 c++中,但是在引入 c++之前该技术已经存在很长时间了。...Array静态空间,一旦配置了就不能改变,要换大一点或者小一点空间,可以,一切琐碎由自己,首先配置一块新空间,然后将旧空间数据搬往新空间,再释放原来空间。...链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个存储数据元素数据域,另一个存储下一个结点地址指针域。...而且,对于任何位置元素插入或元素移除,list永远常数时间。 List和vector两个最常被使用容器。 List容器一个双向链表。...函数对象作用: STL提供算法往往都有两个版本,其中一个版本表现出最常用某种运算,另一版本则允许用户通过template参数形式指定所要采取策略。

2.4K31

开发成长之路(7)-- C++从入门到开发(C++知名库:STL入门·容器(二))

但是呢,为什么我们更多选用vector而非deque呢?因为它指针实在太麻烦了。我们后面就知道了。 除非必要,我们应尽可能选择使用vector而非deque。...此外,它当然也必须记住目前map大小,一旦map空间不足,必须要重新配置一个更大map。 ---- stack – 栈 什么栈?怎么说呢,觉得真应该先写数据结构专栏。失策失策!!!...栈一种先进后出数据结构,它只有一个接口。 只能从一端加入元素,从那一端移除元素,所以并不被允许有其他方法存取元素。 换言之,stack不允许有遍历行为。...STL供应max-heap,最大值在头结点。 heap算法 push_heap算法(尾端插入元素) 本来自己画了图,但是理解了书中图之后,发现他图更有一番风味。...下面来看一下算法实现细节: //该函数接受两个迭代器,用来表现一个heap底部容器头尾,并且新元素已经插入到底部容器最尾端。

33620

一文秒杀 5 道最近公共祖先问题

git pull 这个命令我们经常会用,它默认使用 merge 方式将远端别人修改拉到本地;如果带上参数 git pull -r,就会使用 rebase 方式将远端修改拉到本地。...那么,Git 如何找到两条不同分支最近公共祖先呢?这就是一个经典算法问题了,下面来由浅入深讲一讲。...; 这和我们第一次实现find函数基本上一样,而且你应该知道可以有多种写法,选择这样写代码: // 定义:在以 root 为根二叉树中寻找值为 val1 或 val2 节点 TreeNode...这道题其实不是公共祖先问题,而是单链表相交问题,你把parent指针想象成单链表next指针,题目就变成了: 给你输入两个链表头结点p和q,这两个链表必然会相交,请你返回相交点。...在前文 单链表六大解题套路 中详细讲解过求链表交点问题,具体思路在本文就不展开了,直接给出本题解法代码: Node lowestCommonAncestor(Node p, Node q) {

1.4K30

C++【模板初阶】

_3Addii 而我们参数2为 double ,一个浮点型数据,实际函数调用时,找这个函数_3Addid 此时出现明显链接错误,编译器索性直接在编译前就已经报错阻拦 解决方法: 将参数2强制类型转换为...临时变量具有常性,所以Add函数引用形参需要被 const 修饰 或者不用引用,这样也不需要 const ,但是此时效率会变低 显式实例化 显式实例化就是给编译器打招呼,让它在建房子时按照我们意愿...,编译器会先寻找是否存在目标函数,如果有,编译器便不再根据函数模板生成函数,避免造成代码冗余 我们可以通过调试观察到这一现象 ️注意事项 注意: 函数调用时,并非直接调用函数模板,而是调用编译器根据参数类型和模板生成函数...模板类 即可 //简单演示下 STL容器,这些都是类模板实际运用 vector v1; //实例化为整型顺序表类 list l1; //实例化为浮点型链表类 ️使用方法...如果你觉得本文写还不错的话,可以留下一个小小赞,你支持分享最大动力!

11710

STL:调用empty()而不是检查size()是否为0

vector底层一块连续内存,其迭代器本质上指向这块内存首尾位置两个指针。所以empty()函数在检查这两个指针是否指向同一位置,若是,则说明容器为空,返回true。这当然常数时间。...deque底层分段连续内存组成一块“表面”连续buffer,这是和vector区别,所以其迭代器实现多有区别,不过迭代器本质仍旧指针。...splice会将指定链表对象上指定范围内元素切下来接到目标对象指定位置后,会同时改变两个链表对象size。...比如splice()函数内部_S_distance()函数,由链表本质可以知道,它一定会遍历,从而耗费线性时间。 那么如果splice实现中,没有去更新两个链表size信息呢?...Anyway,可以保证,empty()函数,一定是常数时间性能。 所以,如果在开发中遇到需要判断容器是否为空时候,推荐大家使用empty(),而不是判断size() == 0。

1.1K20
领券