[互联网面试笔试汇总C/C++-17] 链表交点,链表环问题汇总
2013-10-18 12:09
666 查看
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,我会及时更新。
思路:首先明确一点,如果两个链表相交,那么从第一个交点开始到尾结点结束,所有的结点都是公共结点。
这也就是说,如果两个链表相交,那么这两个链表的尾结点肯定是公共结点,如果尾结点不是公共结点,那么这两个链表肯定不相交。
所以我们可以如下操作:依次遍历两个链表,最后判断尾结点是否相同,如果相同,则相交,如果不相同,则不相交。
复杂度:时间: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++-7] 寻找两个链表的第一个交点-微策略
- [互联网面试笔试汇总C/C++-8] 寻找两个链表的第一个交点-微策略
- [互联网面试笔试汇总C/C++-9] 实现赋值运算符函数-剑指offer
- [互联网面试笔试汇总C/C++-20] 如何申请一个大小为n的数组(一维或二维)
- [互联网面试笔试汇总C/C++-19] 指针和引用的区别
- [互联网面试笔试汇总C/C++-22] 拷贝构造函数调用的时机-完美世界
- [互联网面试笔试汇总C/C++-23] Web代理的种类-雅虎
- [互联网面试笔试汇总C/C++-24] Linux守护进程工作原理和方式-雅虎
- [互联网面试笔试汇总C/C++-13] 写一个程序来判断机器的大小端-微策略
- [互联网面试笔试汇总C/C++-21] FIFO 、LRU、LFU的含义、原理和实现-完美世界
- 转[互联网面试笔试汇总C/C++-27] 为什么TCP链接要三次握手而不是两次握手-雅虎
- [互联网面试笔试汇总C/C++-6] 迅雷
- [互联网面试笔试汇总C/C++-25] TCP三次握手及四次挥手详细图解
- [互联网面试笔试汇总C/C++-14] 判断一棵二叉树是否是二叉搜索树-微策略
- [互联网面试笔试汇总C/C++-28] TCP拥塞控制,慢启动算法
- [互联网面试笔试汇总C/C++-12] 哈希表冲突解决办法-网易游戏
- [互联网面试笔试汇总C/C++-7] 堆栈的区别-百度
- [互联网面试笔试汇总C/C++-4] 进程和线程的区别
- [互联网面试笔试汇总C/C++-2] 网易有道-1
- [互联网面试笔试汇总C/C++-9] 实现赋值运算符函数-剑指offer