Skip to content

08-链表 ​

学习链表几个方法

  1. 学会画图,通过图像来比较方便地理解内容
  2. 可以使用虚拟的头结点,这样可以减少一部分边界情况
  3. 可以使用临时节点,这样可以防止链表断开,减少思考步骤

题目 ​

LC2. 两数相加 ​

思路:

  1. 观察题目,发现这个题目不是正序的,而是逆序(从小到大)的,因此不需要翻转列表
  2. 遍历列表,从末尾开始,用 t 来存储两个链表相加的值,然后创建一个新的节点,把个位数的值给加进去。

LC24. 两两交换链表中的节点 ​

这个就要用到我之前说的内容了:

  1. 创建虚拟头结点
  2. 画图来思考,尤其是遇到空指针的时候
  3. 创建临时的节点

LC143. 重排链表 ​

这个题目是一个综合题,它涉及了三个简单题目的思路

思路:

  1. 找到链表的中点
  2. 然后把后面的列表经行翻转
  3. 合并两个列表(非有序)

LC23. 合并 K 个升序链表 ​

这个题目有两个解法,一个解法的通过优先级队列来求解,另一个是通过递归的方式求解。

优先级队列 ​

思路:

  1. 创建一个优先级队列,把各个列表中的头结点放入优先级队列中
  2. 每次获取到堆顶元素,然后堆顶元素直接插入就可以了,如果有下一个节点,那还需要把堆顶元素的下一个节点放回去

这个是和之前的思路一样,只不过是从两个队列比较大小转变为 k 个队列比较大小。

总共遍历个数为 n×k, 每次比较的个数为 log⁡k ,因此它是时间复杂度为 nk×log⁡k

递归 ​

思路:

  1. 主线流程:由于是有序列表,因此可以采用类似归并排序,先排左边那一部分,然后再排右边那一部分,最后再合并一下
  2. 终止条件:当到达最下面的时候,既只有一个元素的时候就要停止

LC25. K 个一组翻转链表 ​

思路:

  1. 先遍历一次链表,计算出它的长度,然后计算出需要翻转的区间的个数 count
  2. 执行两次循环,外面一层表示翻转区间的个数,内部表示同一个区间内翻转的详细逻辑
  3. 最后只要把尾巴加上就可以了