1.合并链表问题
合并两个链表 很简单,dummy虚拟头节点,两个链表从前到后分别做比较
合并K个链表,两种做法
1.利用堆来每次取到最小的node
2. 分治的思想,像mergesort一样,两两merger,最终把所有都merge到一起。 分治的思想一般都递归区间,return的条件就是当l >= r , return 本身的那个点 return list[l].
2.链表中有环的问题
1.链表中的环的问题都采用快慢指针进行判断,快指针走两步,慢指针走一步,如果最终相遇,就是fast == slow, 那就说明有环,否则就说明无环
2.链表中环找起点,分两步,快慢指针,先找到第一次相遇点,然后一个回到起点head,一个从相遇点继续走,再次相遇的点就是环的起点,画图根据距离等式关系可推出来
3.链表是否相交
1.当一个链表走向尾节点时,把他挪到另一个链表的头,另一个节点也这样做,这样就使得两个链表最终会在相交处相遇
4.找倒数的第k个节点
1.常规做法,找到一共有多少个节点,n个,然后在从头遍历n - k次
2.技巧法, 先让一个节点走k次,那他剩余的步数就是n-k次, 再让一个节点从头开走和这个节点一起往后走,这个节点到达末尾了,那么第二个节点就到达倒数第k个节点了
5.快慢指针的应用
快慢指针的应用还可以帮助链表找中点,有快慢指针的题,判断循环结束的条件都是
while (fast != null && fast.next != null) , 不仅要判断fast本身也要判断他的next节点