LeetCode链表 常见的题型以及要注意的点

这是一类很特殊的题目 看到这种题目 不要试图自己去想怎么做 要想一想之前是不是遇到过类似的题目 如果没有的话然后再好好想想技巧以及要注意的点之类的。

注意链表的遍历用while而不是for
由于大多数链表的题目都很简单 因此每个题目的后面都用一句话总结一下要注意的点

Basic:
206 链表反转 use dummy node at head, and use four step swap technique in linkedlist
92 链表反转2 反转部分链表 范围从m到n 和206没什么区别
141 链表成环判断 就是快慢双指针 快的那个指针就2倍速
24 两两交换链表中的节点 swap in pair 这个需要另开来说
328 奇偶链表 给出一个链表 把index 0-2-4-6放前面 1-3-5-7放后面
237 删除链表中的节点 这个题目很奇怪 输入不给头 只给那个要删除的节点 这个解法很tricky 就是不删除节点 而是把值换成下一个节点的值 然后把当前节点的指向next next. 就是说 只是假删除而已 如果非要说删除了什么 则是下一个节点被删除了
19 删除链表倒数第k个节点 双指针 让一个先走k步
83 删除排序链表中的重复元素 删除重复元素知道这个元素只剩一个 双指针
82 删除排序链表中的重复元素2 删除重复元素(一个不留)只需要一个指针
203 移除链表元素 溢出链表中值等于给定值的节点 简单的不能再简单的题目 一个指针不行就两个指针 别太死心眼
369 给单链表+1 这道题就是双指针 用dummy node处理最特殊的999情况 i要放到最后一个不等于9的数字 j要放在最后 然后有点耐心的一点点写就行了
2 将两链表相加 这两个给定的链表代表数字的反序 比369好多了 每个链表上整一个指针就行了 然后对于新建的链表也整个指针
160 相交链表 Write a program to find the node at which the intersection of two singly linked lists begins. 用指针 将一个指针放在短的头部 将另一个放在从前面数b-a处,然后一起走 两者是同一节点这个节点就是最终解
21 合并两个有序链表 简单的不能再简单了 还是指针

Advanced:
234 回文链表 判断链表是否回文 用stack储存 然后pop 比较每次pop出来的跟遍历的是不是一样
143 重排链表 对半折返合并链表 即将123456变成162534 虽然看着复杂 但是实际上就是快慢指针找中点 然后第二部分 然后双链表合并。
142 环形链表2 找环形链表的环的起点:狂慢双指针,当快慢指针相遇 停止 然后重新起始一个慢指针 两个慢指针一起走 直到相遇 相遇点就是环形的起始点
148 排序链表 任意给出一个链表 我们对其排序然后返回排好序的 难点在于我们要用nlogntime以及constant space.其实就是链表的merge sort,这道题还挺有意思 另开一篇文章
25 K个一组反转链表 k个一组进行翻转 这个也分解:一部分专门处理k个停一下 一个函数专门处理reverse
61 旋转链表 把尾部的元素依次放到头部 重复这个过程k次 --其实就是把后面的k个节点平移到头部 唯一要注意的是 当k大于链表总长度的时候的处理 取模就完事了
86 分隔链表 给一个值 所有比这个值小的都移动到左边 反之亦然 如果不要求do it in place,那么就很简单 新建两个链表然后再合并就行了
23 合并k个排序链表 就像是k路归并 如果内存够 就内排序 借助PQ 或者用merge sort
147 对链表进行插入排序 即用插入排序实现对某链表的排序(即插入那部分已经排好序的)用很多指针 细心一些就行了

技巧:
双指针(快慢双指针,间隔双指针)

posted @ 2020-11-20 03:35  EvanMeetTheWorld  阅读(25)  评论(0)    收藏  举报