• 61.Merge k Sorted Lists(合并k个排序链表)


    Level:

      Hard

    题目描述:

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

    Example:

    Input:
    [
      1->4->5,
      1->3->4,
      2->6
    ]
    Output: 1->1->2->3->4->4->5->6
    

    思路分析:

      思路一:通过归并排序思想,将k个排好序的链表,归并成一条有序的链表。

      思路二:使用优先队列(priority_queue)实现堆,初始时将每个链表的第一个结点加入堆中,之后每次弹出堆顶元素,将这个结点指向的下一结点加入到堆中,直到所有结点添加完毕。

    代码:

    思路一:

    public class Solution{
        public ListNode mergeKLists(ListNode[] lists) {
            if(lists==null||lists.length==0)
                return null;
            int start=0;
            int end=lists.length-1;
            return sort(lists,start,end);
        }
        public ListNode sort(ListNode[]lists,int start,int end){
            if(start==end)
                return lists[start];
            int mid=(start+end)/2;
            ListNode l=sort(lists,start,mid);
            ListNode r=sort(lists,mid+1,end);
            return merge(l,r);
        }
        public ListNode merge(ListNode l,ListNode r){
            if(l==null)
                return r;
            if(r==null)
                return l;
            if(l.val<r.val){
                l.next=merge(l.next,r);
                return l;
            }else{
                r.next=merge(l,r.next);
                return r;
            }
        }
    }
    

    思路二:

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    public class Solution{
        public  ListNode mergeKLists(ListNode[] lists){
            if(lists==null||lists.length==0)
                return null;
            PriorityQueue<ListNode>q=new PriorityQueue<>(lists.length,new Comparator<ListNode>(){
                @Override
                public int compare(ListNode o1,ListNode o2){
                    return o1.val-o2.val ;
                }
            });//构造小顶堆
            for(ListNode node:lists){ //每个链表的第一个节点先加入堆
                if(node!=null)
                q.offer(node);
            }
            ListNode res=new ListNode(0);
            ListNode cur=res;
            ListNode temp=null;
            while(!q.isEmpty()){
                temp=q.peek();
                q.poll();
                cur.next=temp;
                cur=cur.next;
                if(temp.next!=null){
                    q.offer(temp.next);
                }
            }
            return res.next;
        }
    }
    
  • 相关阅读:
    $route 侦听路由参数的变化
    vue移动端(持续更新......)
    vue本地开发配置及项目部署
    vue解决虚拟dom复用的问题
    移动端头部固定中间内容滚动
    VUE的路由懒加载及组件懒加载
    VUEX(状态管理)之憨憨篇
    Go-第一篇
    高精度1
    牛客练习赛61
  • 原文地址:https://www.cnblogs.com/yjxyy/p/11090313.html
Copyright © 2020-2023  润新知