剑指offer刷题专栏——专题一:链表

一、学链表我们需要掌握什么?

链表在面试中出现频率排行前2的算法题,因为链表题的特点是:描述非常简单,基本不用花时间去读题,在面试有些的三四十分钟里,链表非常受欢迎。

我们先来说一说学习链表时,我们最需要掌握的是什么?

首先我认为大部分的链表题,解法思路都相对简单,双指针占一半以上,但是上了战场,写链表题的时候,非常容易出错,常见错误是:

1、没有考虑节点为 null 导致空指针异常。

2、容易出现节点位置定位出错,比如往前多走了一步,或者少走了一步。

所以我觉得,做链表题,最重要的就是要掌握:

1、规定好自己的模版,比如我习惯自己弄一个辅助头节点,确定下来之后,就一直这么做,不要变来变去。

2、做的时候,多考虑一步,就是在用 .next 节点的时候,会不会出现异常。

上面这两天是帮助你可以做起题来错误更少,速度更快,除了这两个之外,做链表的题还有非常重要的一个点,那就是:积累解题思路

链表的题型不多,也不难理解,很好积累,所以大家可以多看几道不同类型的题,不然遇到完全陌生的题,那你可能就真的不会的,因为链表的暴力解法都不难。

不过话说回来,在面试中,题型不多,出现最多的还是删除倒数第 K 个节点,反转,交点这一些,思路不难,重在考察代码能力

所以我觉得,学习链表最大的技巧就是多做几遍。

二、算法技巧:巧用双指针

对于双指针,在做关于单链表的题是特别有用,比如“判断单链表是否有环”、“如何一次遍历就找到链表中间位置节点”、“单链表中倒数第 k 个节点”等问题。对于这种问题,我们就可以使用双指针了,会方便很多。我顺便说下这三个问题怎么用双指针解决吧。

例如对于第一个问题

我们就可以设置一个慢指针和一个快指针来遍历这个链表。慢指针一次移动一个节点,而快指针一次移动两个节点,如果该链表没有环,则快指针会先遍历完这个表,如果有环,则快指针会在第二次遍历时和慢指针相遇。

对于第二个问题

一样是设置一个快指针和慢指针。慢的一次移动一个节点,而快的两个。在遍历链表的时候,当快指针遍历完成时,慢指针刚好达到中点。

对于第三个问题

设置两个指针,其中一个指针先移动k个节点。之后两个指针以相同速度移动。当那个先移动的指针遍历完成的时候,第二个指针正好处于倒数第k个节点。

你看,采用双指针方便多了吧。所以以后在处理与链表相关的一些问题的时候,可以考虑双指针哦。

也就是说,你掌握了双指针,意味着掌握了大部分常规链表题,当然,双指针不一定就是快慢指针哦,另外就是,双指针另外一个应用的比较多的领域就是:在排序数组在求和,关于这个,后续应该也会有题讲到。

Day1:4道常规题

本次需要解决的算法题有四个(PS:点击链接会直达Leetcode原文链接)

  • 剑指 Offer 18. 删除链表的节点
  • 剑指 Offer 22. 链表中倒数第k个节点
  • 剑指 Offer 25. 合并两个排序的链表
  • 剑指 Offer 52. 两个链表的第一个公共点

下面简单说一下这几道题:

剑指 Offer 18. 删除链表的节点

难度:★

要求掌握程度:★★★★★

说明:基础题,0 技巧,属于基本功了,自己先试着写一写,如果不会的 ,建议多画个图,多写几遍。

注意点:删除头节点 + 空节点

剑指 Offer 22. 链表中倒数第k个节点

难度:★

要求掌握程度:★★★★★

说明:快慢双指针的运用。

注意点:注意空指针异常

剑指 Offer 25. 合并两个排序的链表

难度:★★

要求掌握程度:★★★★★

说明:本题类似于递归排序算法的 merge 操作,也算是双指针。

注意点:无

剑指 Offer 52. 两个链表的第一个公共节点

难度:★★

要求掌握程度:★★★★★

说明:由于本题是不存在环的,所以相对容易,可以直接遍历计算节点数量之差,也可以采用双指针,不过建议理解双指针的方法,代码优雅。

注意点:无

Day2:3道题

关于栈与递归的选择:单链表只能从前往后遍历,不支持从后往前遍历,所以遇到诸如倒数打印,反转之类的题,我们往往会选择栈来辅助,也可以选择用递归。但是从面试官的解法看,比起栈,递归会更好,因为用栈,那就有点太简单的。

不过无论选择递归还是栈,空间复杂度一样,就是选择递归时,还需要考虑一个递归太深的话,出现内存溢出的情况。

今天的题有三道:

  • 剑指 Offer 06. 从尾到头打印链表
  • 剑指 Offer 24. 反转链表
  • 剑指 Offer 35. 复杂链表的复制

下面是详细说明:

剑指 Offer 06. 从尾到头打印链表
  • 难度:★

  • 要求掌握程度:★★★★

  • 说明:基础题,不建议用栈,最好可以会递归,不会的话,勉强用栈也可以了。

剑指 Offer 24. 反转链表
  • 难度:★★

  • 要求掌握程度:★★★★★

  • 说明:基础题,递归反转+原地反转,两种方法都要掌握

剑指 Offer 35. 复杂链表的复制
  • 难度:★★★

  • 要求掌握程度:★★

  • 说明:这道题考的比较少,主要了解下思路,很容易写错,主要考察代码能力。

Day3 体验一波大厂面试:2道链表变形体

关于剑指offer的题,其实第一天和第二天我们已经把链表相关的题做完了,但是在面试的时候,因为有些题大家都准备过,所以有时候面试官会给出一些变形题,而且这些变形题还考过好几次,所以 Day3 主要给大家看看变形题,让大家以后遇到有思路。

至于答案,这里没有提供,不过网上很多,大家可以去搜索一下。

  • 字节真题:单链表相加
  • 百度真题:环形链表分成三等份。

下面是详细说明:

字节真题:单链表相加

  • 难度:★★★
  • 要求掌握程度:★★★★

这道题还考过挺多次的,你们直接看图片的描述吧

剑指offer刷题专栏——专题一:链表_第1张图片

注意,不允许使用栈,队列等数据结构哦。

难点就是还得进位,而且链表只能前进不能后退。

思路:可以先它他们进行反转,相加之后,得到结果,再把结果进行反转

百度真题:环形链表分成三等份。

  • 难度:★★★
  • 要求掌握程度:★★

题目:给一个环形链表,请你将他三等分。

面试分析:对于这种题,一定要和面试官讨论一些条件,比如这个链表的节点个数是否为 3 的倍数?如果不是 3 的倍数,是否是让前面一部分的链表的节点个数多一些?

反转就是,大家看到一道面试题,切完不能噼里啪啦做,而是要讨论好边界条件,再去做,否则你就要自己判断所有边界,麻烦的很。

面试官也是很希望你能和他讨论分析的。

你可能感兴趣的:(剑指offer刷题,链表,数据结构,leetcode,算法,软件工程,c++)