zoukankan      html  css  js  c++  java
  • 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;
        }
    }
    
  • 相关阅读:
    网站压力测试工具----webbench
    skin.xml
    krpano和react的结合展示
    swiper的相关用法
    js的hover实现方法。
    js的slice和split和splice和substring和substr的区别
    使用JSSDK分享页面
    微信jssdk分享功能开发
    点击复制
    JS的document.all函数使用 示例
  • 原文地址:https://www.cnblogs.com/yjxyy/p/11090313.html
Copyright © 2011-2022 走看看