题目

代码分析

method1:使用优先级队列,堆的方式来控制三个链表的头
method2:归并排序的应用

代码展示

方法1 优先级队列

public static ListNode mergeKLists(ArrayList<ListNode> lists) {
        //小顶
        PriorityQueue<ListNode> pq=new PriorityQueue<ListNode>(new Comparator<ListNode>() {
            @Override
            public int compare(ListNode o1, ListNode o2) {
                return o1.value-o2.value;
            }
        });

        for(ListNode e:lists)
        {
            pq.add(e);
        }
        ListNode res=new ListNode(0);
        ListNode cur=res;
        while(!pq.isEmpty())
        {
            ListNode temp=pq.poll();
            cur.next=temp;
            cur=cur.next;
            if(temp.next!=null)
            {
                pq.add(temp.next);
            }
        }
        return res.next;
    }

方法2 归并排序的应用

   public ListNode mergeKLists(ArrayList<ListNode> lists)
    {
         if(lists==null||lists.size()==0){
           return null;
         }
        //init
        ListNode[] listArr=new ListNode[lists.size()];
        for(int i=0;i<listArr.length;i++)
        {
            listArr[i]=lists.get(i);
        }

        return mergeKLists(listArr,0,listArr.length-1);
    }

    public static ListNode mergeKLists(ListNode[] listArr,int left,int right)
    {
        if(left==right) return listArr[left];
        int mid=(left+right)/2;
        ListNode cur1=mergeKLists(listArr,left,mid);
        ListNode cur2=mergeKLists(listArr,mid+1,right);
        return mergeTwoLists(cur1,cur2);
    }   

    public static ListNode mergeTwoLists(ListNode head1,ListNode head2)
    {
        if(head1==null) return head2;
        if(head2==null) return head1;

        if(head1.val<head2.val)
        {
           head1.next=mergeTwoLists(head1.next,head2);
           return head1;
        }
        else
        {
            head2.next=mergeTwoLists(head1,head2.next);
            return head2;
        }
    }

完成情况

1次