[互联网面试笔试汇总C/C++-17] 链表交点,链表环问题汇总
来源:互联网 发布:开淘宝卖什么最赚钱 编辑:程序博客网 时间:2024/05/21 11:06
1.给定两个链表,判断是否有相交。
思路:首先明确一点,如果两个链表相交,那么从第一个交点开始到尾结点结束,所有的结点都是公共结点。
这也就是说,如果两个链表相交,那么这两个链表的尾结点肯定是公共结点,如果尾结点不是公共结点,那么这两个链表肯定不相交。
所以我们可以如下操作:依次遍历两个链表,最后判断尾结点是否相同,如果相同,则相交,如果不相同,则不相交。
复杂度:时间:O(m+n),m,n分别为两个链表的长度;空间:O(1)
2.给定两个链表,找到第一个公共结点。
思路:我们最容易想到的是从尾结点开始挨个向前比较,最后一个相同的就是第一个公共结点。
但是单链表只能从前往后进行遍历,如果想要从后往前的话则需要先从前向后遍历一次,同时用栈来记录每一个结点,最后出栈,然后挨个对比,这样的确可行,但是却要额外付出O(m+n)的空间。
仔细想想,我们可以先分别遍历两个单链表,记录长度m和n(无妨假设m>n),然后先让长度为m的链表向后走(m-n)步,接着两个链表同时向后遍历,第一个相同的结点就是要求的第一个公共结点。
复杂度:O(m+n),m,n分别为两个链表的长度;空间:O(1)
扩展:有的面试官为了考察学生的思维能力,会在上面基础上,要求每个链表只能遍历一次,可以对链表做任何修改。
这个也很简单,解法见:http://blog.csdn.net/alexander_xfl/article/details/12560249
3.给定一个链表,判断是否有环。
思路:这个是一个经典的问题了,思路也很简单,我们首先设置两个指针p1,p2同时指向链表的头部,然后p1每次向后走1步,p2每次向后走2步。
如果有环,那么有一步会出现p1=p2,如果p2已经到达了尾结点,则无环。
复杂度:时间:O(n),n是链表的长度;空间:O(1)
4.给定一个链表,找出环的入口位置。
思路:这个和3问题的基本思路一样,只是需要多做一步,那就是当p1=p2的时候,将p1重新指向链表的头结点,然后p1和p2都每次向后走一步,下一次p1=p2的结点就是环的入口。
复杂度:时间:O(n),n是链表的长度;空间:O(1)
这是在笔试面试中遇到的关于环的一些问题,今天总结了一下,供大家参考,算是了却了一桩心事。
如果大家还有关于链表的一些题目,欢迎留言或者发送邮件到alexander_xfl@163.com,我会及时更新。
- [互联网面试笔试汇总C/C++-17] 链表交点,链表环问题汇总
- [互联网面试笔试汇总C/C++-8] 寻找两个链表的第一个交点-微策略
- [互联网面试笔试汇总C/C++-2] 网易有道-1
- [互联网面试笔试汇总C/C++-3] 网易有道-2
- [互联网面试笔试汇总C/C++-5] 网易有道-3
- [互联网面试笔试汇总C/C++-6] 迅雷
- [互联网面试笔试汇总C/C++-18] 生产者消费者模型
- [互联网面试笔试汇总C/C++-6] 迅雷
- [互联网面试笔试汇总C/C++-1] 搜狗笔试-1
- [互联网面试笔试汇总C/C++-4] 进程和线程的区别
- [互联网面试笔试汇总C/C++-7] 堆栈的区别-百度
- [互联网面试笔试汇总C/C++-9] 实现赋值运算符函数-剑指offer
- [互联网面试笔试汇总C/C++-10] 糖果拆包-美团
- [互联网面试笔试汇总C/C++-11] 字符串全排列和组合算法
- [互联网面试笔试汇总C/C++-12] 哈希表冲突解决办法-网易游戏
- [互联网面试笔试汇总C/C++-19] 指针和引用的区别
- [互联网面试笔试汇总C/C++-22] 拷贝构造函数调用的时机-完美世界
- [互联网面试笔试汇总C/C++-23] Web代理的种类-雅虎
- YV12转换到IplImage
- Web Storage:简单强大的客户端数据存储技术
- 我目前对日志文件系统的一些理解
- for i in {1..254};do ping -c 1 192.168.1.$i;done
- iPhone 开发 nsarray
- [互联网面试笔试汇总C/C++-17] 链表交点,链表环问题汇总
- JNI学习二:字符串参数传递与返回值
- Ant 打 war 包过程
- linux如何确保压缩文件解压完全,解压前后文件个数一致
- 《经济学讲义》-李俊慧读书笔记
- linux shell 基础篇1.1
- Ehcache 整合Spring 使用页面、对象缓存
- /(^\s*)|(\s*$)/g
- foreach循环