学完链表,不去找几个经典例题巩固一下知识?链表的五大OJ经典例题,你会吗?不妨来看一看(知识剖析+图形理解)(下)

简介: 学完链表,不去找几个经典例题巩固一下知识?链表的五大OJ经典例题,你会吗?不妨来看一看(知识剖析+图形理解)(下)

代码优化1:


我们发现上述代码好像有很多类似和冗余的,因为我们并不知道才开始list1和list2谁大谁小,所以我们第一次插入时,都需要判断一下;如果我们先直接取两者最小值作为头,后面不就可以直接插入了吗?避免每次都要在循环里判断一下!


具体代码:


image.png


代码优化2:


有了上面的思路,我们不难想出哨兵位作为头,我们开闭一个空间的指针作为头结点;后面的链各个链表插入时,也不需要在做判空的判断,直接插入就可了;最后我们在把创建的哨兵位非free掉就可以啦!


具体代码:


image.png


题目4:判断链表是否有环


给你一个链表的头节点 head ,判断链表中是否有环。有环返回true,没环返回false


示例1:


4a31273d9ba64985a0d76e1bcb3e3888.png


示例2:

c2c05e9d9db842f59705b12f3ae49135.png



思路:双指针法===》快慢指针


这道题目的思路和题目2的思路很相似,都是采用双指针;一个慢指针flow和一个快指针fast;如果有环,快指针和慢指针会相遇,此时就返回true;如果没环,快指针和慢指针永远不会相遇,此时返回false。下面先画图分析一下:


逻辑图:


第一种情况:如果没有环


97a0306520b846d2a554e390dd09c080.png


第二种情况:如果有环

77c70eb93747405e9f8fdc85909c81be.png



具体代码:


根据我们上面的简单分析,我们就可以开始写出核心代码了:

0692f49f2ae74fa0996d86fd6a6f1f4f.png



扩展两个思考题:


有了上一题的分析,我们不妨扩展一下,提出两个问题:


1、请证明:slow一次走一步,fast一次走2步;slow和fast一定会在环里面相遇?有没有可能追不上?


2、请证明:slow一次走一步,fast一次走3步行不行?


                  slow一次走一步,fast一次走4步行不行?


结论:


1、slow一次走1步,fast一次走2步,一定能追上


slow进环以后,fast正式开始追了,假设slow和fast之间的距离是N;在追的过程中,他们之间的距离是如何变化的?


30163a6328e5439d8ca37cecc76022fe.png


距离从N—N-1—N-2—N-3—N-4......—0,每次距离缩小1,最终肯定会使距离缩小到0;距离是0的时候肯定就相遇了!


2、slow一次走1步,fast一次走3步,不一定能追上;甚至可能会死循环,永远追不上


slow进环以后,fast正式开始追了,假设slow和fast之间的距离还是N;在追的过程中,他们之间的距离是如何变化的?


距离从N—N-2—N-4—......最终的距离就不一定是0;有两种可能性:


如果N是偶数那么可以减到0,如果N是奇数那么最终减到-1;


距离是0:代表相遇;


距离是-1:代表fast反超了slow,进入新的追逐,它们的距离变成了C-1(C是环的长度)。如果C-1是偶数,就能追上;如果是C-1是奇数,它们又再次错开,距离还是C-1,陷入死循环,永远追不上!


我们不妨画图理清一下思路:


b74cb3a5c75941d48975804d29ec3218.png


slow一次走一步,fast一次走4步这里不再赘述,还是要分开讨论,N—N-2—N-4—.....最终的结果就有可能使0、-1、-2;感兴趣的小伙伴可以自己去分析一下!


题目5:求环形链表的入口点


思路:画图推导


这道题的连贯性就比较强,会用到题目2和题目4的知识点!!!有了上面的分析,我们得到只有快指针fast比慢指针slow多走一步,才会必然相遇;在这个条件下,我们不妨求它们的入口点:



bb22d997f6ef4dee88592ab742cbc44b.png


我们不妨设相遇点为meet,先给出结论,然后我们在推导一下这个结论:一个指针从meet点开始走,一个指针从链表开始走,它们会在入口点相遇;我们不妨画图来分析一下:


f5877abb17084ef08756a7fade104a66.png


这里快指针fast的路程为什么是L+nC+x,而不是L+C+X? 我们不妨考虑这一种情况:

f68ea03aec304af7b55ae19885e67939.png


当L很长时,而C很短时,在slow进环之前,fast可能就不止转了1圈;所以当slow进环后,fast追上slow,fast就可能转了nC圈!


有了上面的分析我们不妨推导一下,我们知道当快指针fast和慢slow相遇时,fast走的距离应该是slow的2倍:


ab437ee7b34d421a9c3bd26cb91e32e2.png


所以我们前面的结论就推导出来了:一个指针从meet点开始走,一个指针从链表开头开始走,它们会在入口点相遇!!!


具体代码:


根据我们上面的简单分析,我们就可以开始写出核心代码了:


93a56cfdf2ea4d7b8777b5d8aa12f052.png



总结:

 

以上就是今天学习的的内容,这些题目并没有让我们直接去写链表的一些接口,但利用的都是链表的知识点。我们通过先画图分析的方式,让大家更容易理解!我们只有分析明白了,再写代码实现时,才会更加的顺畅;希望这篇博客让各位有所收获。感谢支持!


相关文章
|
1月前
|
存储 Java
数据结构第三篇【链表的相关知识点一及在线OJ习题】
数据结构第三篇【链表的相关知识点一及在线OJ习题】
26 7
|
4月前
【数据结构OJ题】环形链表
力扣题目——环形链表
38 3
【数据结构OJ题】环形链表
|
4月前
【数据结构OJ题】复制带随机指针的链表
力扣题目——复制带随机指针的链表
53 1
【数据结构OJ题】复制带随机指针的链表
|
4月前
【数据结构OJ题】环形链表II
力扣题目——环形链表II
32 1
【数据结构OJ题】环形链表II
|
4月前
【数据结构OJ题】相交链表
力扣题目——相交链表
34 1
【数据结构OJ题】相交链表
|
4月前
【数据结构OJ题】合并两个有序链表
力扣题目——合并两个有序链表
42 8
【数据结构OJ题】合并两个有序链表
|
4月前
【数据结构OJ题】链表中倒数第k个结点
牛客题目——链表中倒数第k个结点
37 1
【数据结构OJ题】链表中倒数第k个结点
|
4月前
【数据结构OJ题】链表分割
牛客题目——链表分割
32 0
【数据结构OJ题】链表分割
|
4月前
【数据结构OJ题】链表的回文结构
牛客题目——链表的回文结构
39 0
【数据结构OJ题】链表的回文结构
|
4月前
【数据结构OJ题】链表的中间结点
力扣题目——链表的中间结点
27 0
【数据结构OJ题】链表的中间结点