package Mergeordered;
import java.util.Comparator;
import java.util.PriorityQueue;
/**
* @author 真他喵的学不动咯
* @create 2022-08-14--11:07
*/
public class orde { //三个链表合成一个有序链表
//https://leetcode-cn.com/problems/merge-k-sorted-lists/?utm_source=LCUS&utm_medium=ip_redirect&utm_campaign=transfer2china
public static class ListNode{
public int val;
public ListNode next;
}
//自己定义比较器
public static class ListNodeComparator implements Comparator<ListNode> {
@Override
public int compare(ListNode o1, ListNode o2) {
return o1.val-o2.val;
// o1.val<o2.val,负数,谁的值小只放前面
}
}
//合并链表的方法
public static ListNode mergeKList(ListNode[] lists){
//边界情况
if (lists==null){
return null;
}
//正常情况
PriorityQueue<ListNode> heap=new PriorityQueue<>(new ListNodeComparator()); //优先队列
for (int i=0;i<lists.length;i++){
if (lists[i]!=null){
heap.add(lists[i]); //所有的头结点进入小根堆
}
}
if (heap.isEmpty()){
return null;
}
ListNode head=heap.poll(); //先从优先队列里弹出一个,作为大链表的头
ListNode pre=head;
if (pre.next!=null){ //如果小链表上还有数
heap.add(pre.next); //把小链表的数加入堆里面
}
while (!heap.isEmpty()){ //直到所有小根堆变成空的
ListNode cur =heap.poll(); //把堆的数弹出去一个
pre.next=cur;
pre=cur;
if (cur.next!=null){
heap.add(cur.next); //ListNode cur =heap.poll(),出去一个;heap.add(cur.next); ,next方向上进去一个
}
}
return head;
}
//只有头会进入小根堆,
// 复杂度O(N*log M),M条链表,N个总结点数个数
}
//三个链表合成一个有序链表
最新推荐文章于 2023-05-20 22:14:47 发布