单链表的六大解题套路

21.合并两个有序链表

23.合并K个升序链表

141.环形链表

142.环形链表 II

876.链表的中间结点

160.相交链表

19.删除链表的倒数第N个结点

合并两个有序链表

题目详情可见 合并两个有序链表

2

合并 K 个升序链表

题目详情可见 合并K个升序链表

利用 优先队列 来处理,即 最小堆

每次选择堆顶元素(最小值),并加入 「堆顶元素.next」

其实与合并两个链表思路一致,只不过合并两个链表是选择两个元素中的最小值,合并K个链表是选择K个元素中的最小值而已

环形链表

题目详情可见 环形链表

3

3

采用快慢指针的方法

slow 每次移动一步;fast 每次移动两步

如果存在环,slow 和 fast 必会相遇

环形链表 II

题目详情可见 环形链表 II

4

和上面题目的区别:需要返回链表开始入环的第一个节点

k = x + y

2k = x + y + z + y

所以有:x = z

相遇后,令其中一个回到起点,然后以相同的速度移动,再次相遇时即是环起点

链表的中间结点

题目详情可见 链表的中间结点

利用快慢指针,当 fast 到达终点时,slow 刚好到达中点

当节点数量为奇数时,中间节点正好为 1 个

当节点数量为偶数时,中间节点有 2 个,正好返回第 2 个中间节点

相交链表

题目详情可见 相交链表

4

思路:当 A 移动完后,接着从 B 开始移动;同理,当 B 移动完后,接着从 A 开始移动

  • 如果有交点,则会在交点处相遇
  • 如果没有交点,则会移动到 null 处停止 (这个处理太妙了)

删除链表的倒数第 N 个结点

题目详情可见 删除链表的倒数第N个结点

5

先行节点:提前移动N步

后行节点:在先行节点移动完N步后再移动

当先行节点到达表尾时,后行节点的位置即为倒数第N个节点

总结

技巧总结

  1. 虚拟头节点,方便处理一些特殊 null 指针情况

  2. 快、慢指针套路

    • 求中间节点 / 判断环(两倍速度)
    • 倒数第 N 个节点(fast 先移动 N 步)
    • 确定入环节点(先两倍速度,后一倍速度)
  3. 合并链表

    • 两个链表合并(依次比较头节点)
    • K 个链表合并(利用优先队列,快速得到最小值元素)
  4. 链表相交

    • 先走完自己的链表,然后转而走对方链表,相等处即为交点