主要是快慢指针法、归并排序,连接两个子链表、连接两个子节点,怎么连接。
1、反转链表
方法一:使用栈
方法二、不使用额外空间,直接反转(先反转两个,即搞清前一个与后一个的关系,后面重复即可)
2、链表中的节点每K个一组反转
根据头结点和尾结点 反转链表 然后每k个一组 连接链表单元。连接链表单元,注意,定义前一个链表尾结点,后一个链表头结点和尾结点
3、判断是否有环:快慢指针法,同一起点出发,跑的快的一定会追上跑得慢的
注意判断条件(fast!=null&&fast.next!=null) 因为fast==null 则fast.next会报空指针异常
同理,fast.next==null,则fast.next.next会报空指针异常。
4、链表中环的入口节点
首先判断是否有环,有环的情况下,根据快指针速度是慢指针速度的两倍,得到距离公式。
然后得出环的入口节点。
5、删除链表的倒数第n个节点并返回链表的头指针(双指针法)
6、返回链表中的倒数第k个节点(双指针法,快指针先走k步)
7、合并有序链表
注意:ListNode t = new ListNode(0);不能初始化为null,因为这样t.next会报空指针异常
8、合并k个有序链表(优先队列解决,优先队列实际使用了大顶堆与小顶堆)
同样的使用优先队列,解决返回第k大数的问题
方法一:优先队列
方法二:使用归并排序(分治法)
9、链表排序