链表在面试中出现频率排行前2的算法题,因为链表题的特点是:描述非常简单,基本不用花时间去读题,在面试有些的三四十分钟里,链表非常受欢迎。
我们先来说一说学习链表时,我们最需要掌握的是什么?
首先我认为大部分的链表题,解法思路都相对简单,双指针占一半以上,但是上了战场,写链表题的时候,非常容易出错,常见错误是:
1、没有考虑节点为 null 导致空指针异常。
2、容易出现节点位置定位出错,比如往前多走了一步,或者少走了一步。
所以我觉得,做链表题,最重要的就是要掌握:
1、规定好自己的模版,比如我习惯自己弄一个辅助头节点,确定下来之后,就一直这么做,不要变来变去。
2、做的时候,多考虑一步,就是在用 .next 节点的时候,会不会出现异常。
上面这两天是帮助你可以做起题来错误更少,速度更快,除了这两个之外,做链表的题还有非常重要的一个点,那就是:积累解题思路
链表的题型不多,也不难理解,很好积累,所以大家可以多看几道不同类型的题,不然遇到完全陌生的题,那你可能就真的不会的,因为链表的暴力解法都不难。
不过话说回来,在面试中,题型不多,出现最多的还是删除倒数第 K 个节点,反转,交点这一些,思路不难,重在考察代码能力。
所以我觉得,学习链表最大的技巧就是多做几遍。
对于双指针,在做关于单链表的题是特别有用,比如“判断单链表是否有环”、“如何一次遍历就找到链表中间位置节点”、“单链表中倒数第 k 个节点”等问题。对于这种问题,我们就可以使用双指针了,会方便很多。我顺便说下这三个问题怎么用双指针解决吧。
例如对于第一个问题
我们就可以设置一个慢指针和一个快指针来遍历这个链表。慢指针一次移动一个节点,而快指针一次移动两个节点,如果该链表没有环,则快指针会先遍历完这个表,如果有环,则快指针会在第二次遍历时和慢指针相遇。
对于第二个问题
一样是设置一个快指针和慢指针。慢的一次移动一个节点,而快的两个。在遍历链表的时候,当快指针遍历完成时,慢指针刚好达到中点。
对于第三个问题
设置两个指针,其中一个指针先移动k个节点。之后两个指针以相同速度移动。当那个先移动的指针遍历完成的时候,第二个指针正好处于倒数第k个节点。
你看,采用双指针方便多了吧。所以以后在处理与链表相关的一些问题的时候,可以考虑双指针哦。
也就是说,你掌握了双指针,意味着掌握了大部分常规链表题,当然,双指针不一定就是快慢指针哦,另外就是,双指针另外一个应用的比较多的领域就是:在排序数组在求和,关于这个,后续应该也会有题讲到。
本次需要解决的算法题有四个(PS:点击链接会直达Leetcode原文链接)
下面简单说一下这几道题:
难度:★
要求掌握程度:★★★★★
说明:基础题,0 技巧,属于基本功了,自己先试着写一写,如果不会的 ,建议多画个图,多写几遍。
注意点:删除头节点 + 空节点
难度:★
要求掌握程度:★★★★★
说明:快慢双指针的运用。
注意点:注意空指针异常
难度:★★
要求掌握程度:★★★★★
说明:本题类似于递归排序算法的 merge 操作,也算是双指针。
注意点:无
难度:★★
要求掌握程度:★★★★★
说明:由于本题是不存在环的,所以相对容易,可以直接遍历计算节点数量之差,也可以采用双指针,不过建议理解双指针的方法,代码优雅。
注意点:无
关于栈与递归的选择:单链表只能从前往后遍历,不支持从后往前遍历,所以遇到诸如倒数打印,反转之类的题,我们往往会选择栈来辅助,也可以选择用递归。但是从面试官的解法看,比起栈,递归会更好,因为用栈,那就有点太简单的。
不过无论选择递归还是栈,空间复杂度一样,就是选择递归时,还需要考虑一个递归太深的话,出现内存溢出的情况。
今天的题有三道:
下面是详细说明:
难度:★
要求掌握程度:★★★★
说明:基础题,不建议用栈,最好可以会递归,不会的话,勉强用栈也可以了。
难度:★★
要求掌握程度:★★★★★
说明:基础题,递归反转+原地反转,两种方法都要掌握
难度:★★★
要求掌握程度:★★
说明:这道题考的比较少,主要了解下思路,很容易写错,主要考察代码能力。
关于剑指offer的题,其实第一天和第二天我们已经把链表相关的题做完了,但是在面试的时候,因为有些题大家都准备过,所以有时候面试官会给出一些变形题,而且这些变形题还考过好几次,所以 Day3 主要给大家看看变形题,让大家以后遇到有思路。
至于答案,这里没有提供,不过网上很多,大家可以去搜索一下。
下面是详细说明:
要求掌握程度:★★★★
这道题还考过挺多次的,你们直接看图片的描述吧
注意,不允许使用栈,队列等数据结构哦。
难点就是还得进位,而且链表只能前进不能后退。
思路:可以先它他们进行反转,相加之后,得到结果,再把结果进行反转
要求掌握程度:★★
题目:给一个环形链表,请你将他三等分。
面试分析:对于这种题,一定要和面试官讨论一些条件,比如这个链表的节点个数是否为 3 的倍数?如果不是 3 的倍数,是否是让前面一部分的链表的节点个数多一些?
反转就是,大家看到一道面试题,切完不能噼里啪啦做,而是要讨论好边界条件,再去做,否则你就要自己判断所有边界,麻烦的很。
面试官也是很希望你能和他讨论分析的。