- 合并两个有序链表
- 思路:设置两个指针,分别对两个链表从头开始遍历并比较其值大小,决定合并的结点顺序;
- 要点:
- 1)设置虚拟头结点后,要设置返回值为dummy.next,否则返回的链表会加上虚拟头结点,其值为-1;
- 2)遍历链表时,要判断是否已空,若有一个链表为空,则不必再对结点值作比较;
- 合并K个有序链表
- 思路:每次使用优先级队列(二叉堆)选出k个链表中值最小的结点加入合并链表中。
- 要点:
- 优先级队列的使用;
- 算法时间复杂度的分析: ,其中K为待合并链表的条数,N为所有链表中结点的总个数;
- 寻找链表的倒数第K个结点;=>删除链表的倒数第n个结点;
- 思路:在只遍历一次链表的前提下,找到倒数第K个结点。先设置一个指针P1指向链表的头结点,让p1走k步,再设置另一个指针p2指向链表的头结点,此后p1,p2同时向前走,当p1走到链表末尾空指针时,p2指向第倒数k个结点;
- 要点:设置第二个指针p2的时机是第一个指针p1走了K步;两个指针都是从链表头指针开始遍历;
- 寻找链表中点=>判断链表中是否有环
- 思路:设置快慢指针从头结点开始对链表进行遍历,慢指针每走一步,快指针走两步。快慢指针相遇,说明含有环。
- 要点:遍历结束的条件为
fast != null && fast.null != null - 问题1:为什么不是
fast.next != null && fast.next.next != null? - 问题2:换成
fast.next != null && fast != null也不行?