目录
1.合并k个有序链表
leetcode23题
合并两个有序链表的解题思路就是前面归并排序中的merge方法。
解题思路:合并k个有序序列的链表的逻辑类似合并两个有序链表,难点在于,如何快速得到k个结点中的最小结点,这里我们可以想到使用PriorityQueue或者TreeSet数据结构来存储k个结点,每次弹出一个结点(最小值对应的结点),然后弹出的结点的下一个结点添加到数据结构中,直至对列为null。
```Java
public static ListNode mergeKLists(ListNode[] lists) {
//小根堆
PriorityQueue<ListNode> pq=new PriorityQueue<>(new Comparator<ListNode>() {
@Override
public int compare(ListNode o1, ListNode o2) {
return o1.val-o2.val;
}
});
ListNode dummy=new ListNode(-1);
ListNode p=dummy;
//将链表中的头结点加入队列中
for (ListNode listnode:lists){
if(listnode!=null){
pq.add(listnode);
}
//弹出,加入
while(!pq.isEmpty()){
ListNode node=pq.poll();
p.next=node;
p=p.next;
if(node.next!=null){
pq.add(node.next);
}
}
return dummy.next;
}
```
优先队列的弹出和添加操作时间复杂度O(logk),总的时间复杂度O(NlogK),N是总结点数。
2.判断链表中是否有环
leetcode141题
要求:给定⼀个链表,判断链表中是否有环,如果链表中存在环,则返回 true,否则返回 false
解题思路:使用快慢指针,fast指针前进两步,slow指针前进一步,如果 fast 最终遇到空指针,说明链表中没有环;如果 fast 最终和 slow 相遇,那肯定是 fast 超过了slow ⼀圈,说明链表中含有环。
```Java
public static boolean hasCycle(ListNode head) {
ListNode fast=head,slow=head;
//因为fast指针需要跳两步,所以以下两个条件都得满足
while(fast!=null&&fast.next!=null){
fast=fast.next.next;
slow=slow.next;
if(fast==slow){
return true;
}
}
return false;
}
```
3.如果有环返回第一个入环结点
leetcode142题
要求:给定⼀个链表,返回链表开始⼊环的第⼀个节点,如果链表⽆环,则返回 null(不允许修改给定的链表)。
解题思路