当前位置:编程学习 > C/C++ >>

[互联网面试笔试汇总C/C++-17] 链表交点,链表环问题汇总

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)
 
这是在笔试面试中遇到的关于环的一些问题,今天总结了一下,供大家参考,算是了却了一桩心事。
 
补充:软件开发 , C语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,