合并k个有序链表

给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
在这里插入图片描述
在这里插入图片描述
这个问题,我个人有两种解法,一种是根据归并排序的思想,每两个有序链表进行合并,最终合并为,一个最大的有序链表;还有一种解法是利用PriorityQueue做,可以建立一个小根堆,和一个傀儡头节点,每次将最小的链表取出, 将最小链表的头结点放到傀儡链表中,并且判断当前节点的下一个是否为空,若不为空,就将它的下一个节点作为头结点放进优先级队列中去,若为空,就不用放了。

分治思想

public  ListNode merge(ListNode l ,ListNode r){
                ListNode tmp =  new ListNode(-1);
                ListNode tCur = tmp;
                while(l != null && r != null){
                     if(l.val <= r.val){
                         tCur.next = l;
                         l = l.next;
                     }else{
                         tCur.next = r;
                         r = r.next;
                     }
                     tCur = tCur.next;
                }
                while(l != null){
                       tCur.next = l;
                         l = l.next;
                         tCur = tCur.next;
                }
                while(r != null ){
                      tCur.next = r;
                         r = r.next;
                          tCur = tCur.next;
                }
                return tmp.next;
    }
    public  ListNode  div(ListNode[] lists, int left ,int right ){
            if(left >= right){
                return lists[left];
            }
            int mid = (left+right) /2 ; 
           ListNode l =  div(lists, left,mid);
           ListNode r =  div(lists, mid+1,right);
           return  merge(l,r);
    }

优先级队列思想

  PriorityQueue<ListNode> q = new PriorityQueue<>((o1,o2)->{return o1.val - o2.val;});
        for(int i = 0 ; i < lists.length ; i++ ){
            if(lists[i] != null){
                    q.offer(lists[i]);
            }
        }
        ListNode tmp = new ListNode(-1);
        ListNode tCur = tmp;
        while(!q.isEmpty()){
                ListNode node = q.poll();
                tCur.next = node;
                tCur = tCur.next;
                if(node.next != null){
                    node = node.next;
                    q.offer(node);
                }

        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值