当前位置: 首页 > wzjs >正文

北京网站设计价格安徽网站关键字优化

北京网站设计价格,安徽网站关键字优化,网站上二维码怎么做的,免费做网站的软件描述合并 k 个排序链表(序列为升序序列),并且返回合并后的排序链表(序列为升序序列)。尝试分析和描述其复杂度.样例 1:输入:lists [2->4->null,null,-1->null]输出:-1->…

描述

合并 k 个排序链表(序列为升序序列),并且返回合并后的排序链表(序列为升序序列)。尝试分析和描述其复杂度.

样例 1:

输入:

lists = [2->4->null,null,-1->null]

输出:

-1->2->4->null

解释:

将2->4->null、null和-1->null合并成一个升序的链表。

样例 2:

输入:

lists = [2->6->null,5->null,7->null]

输出:

2->5->6->7->null

解释:

将2->6->null、5->null和7->null合并成一个升序的链表

第一种:顺序合并法

思路:从 lists 中取出第一个链表 currentListNode.

然后依次用 JoinAnotherList()方法 与其他链表合并.

JoinAnotherList() 是标准的两个有序链表合并逻辑,使用一个 tail 指针控制结果链表

第二种:最小堆法

思路:

初始化小根堆,把每条链表的 头节点 放进去。

每次从堆中 poll() 出选出当前最小的节点。

把它接到结果链表的尾部。

如果该节点还有 next 节点,也放入堆中-即把当前链表的后续节点也放进去。

重复以上过程直到堆为空。

顺序合并法代码如下:

/**

 * Definition for ListNode.

 * public class ListNode {

 *     int val;

 *     ListNode next;

 *     ListNode(int val) {

 *         this.val = val;

 *         this.next = null;

 *     }

 * }

 */

public class Solution {

    /**

     * @param lists: a list of ListNode

     * @return: The head of one sorted list.

     */

    public ListNode mergeKLists(List<ListNode> lists) {  

        // write your code here

        //双链表的插入 由于题目已知每个链表是升序的

        //依次将每个ListNode进行插入

        if(lists.size()<=0)

        {

            return null;

        }

        ListNode currentListNode=lists.get(0);

        for(int i=1;i<lists.size();i++)

        {

             currentListNode=JoinAnotherList(currentListNode,lists.get(i));

        }

        return currentListNode;

    }

    public ListNode JoinAnotherList(ListNode initialListNode,ListNode anotherListNode)

    {

         // 虚拟头结点,避免空指针

         if (initialListNode == null) return anotherListNode;

        if (anotherListNode == null) return initialListNode;

        // 初始化头指针和尾指针

        ListNode returnList = null;

        ListNode tail = returnList;

        ListNode firstListNode = initialListNode;

        ListNode secondListNode = anotherListNode;

        //给 returnList 和 tail 赋初值

         if (firstListNode.val <= secondListNode.val) {

            returnList = tail = firstListNode;

        firstListNode = firstListNode.next;

            } else {

        returnList = tail = secondListNode;

        secondListNode = secondListNode.next;

            }


        while(firstListNode!=null&&secondListNode!=null)

        {

            if(firstListNode.val<=secondListNode.val)

            {

                tail.next=firstListNode;

                firstListNode=firstListNode.next;

            }else

            {

                tail.next=secondListNode;

                secondListNode=secondListNode.next;

            }

            tail = tail.next;

        }

        while(firstListNode!=null)

        {

            tail.next=firstListNode;

            firstListNode=firstListNode.next;

            tail = tail.next;

        }

        while(secondListNode!=null)

        {

            tail.next=secondListNode;

            secondListNode=secondListNode.next;

            tail = tail.next;

        }

        return returnList;

    }

}

堆排序法代码如下:

首先我们需要明确一点

Comparator 在处理不同的数据结构使用 Comparator 时,底层会调用不同的排序算法

使用场景是否用 Comparator底层排序算法
Arrays.sort(Object[], Comparator)TimSort(归并 + 插入排序优化)
Collections.sort(List, Comparator)TimSort
TreeSet, TreeMap红黑树(不是真正意义的排序,而是二叉搜索树插入)
PriorityQueue堆排序(最小堆)

而当前的堆排序插入删除时间复杂度是log(n) 查询是log(1)但堆排序不是稳定的排序算法这一点需要注意在不同场景的适用性

public class Solution {

    private Comparator<ListNode> ListNodeComparator=new Comparator<ListNode>()

    {

        public int compare(ListNode currentLeftNode,ListNode currentRightNode ) //compare是固定写法 左边减去右边 意思是

        如果返回 负数currentLeftNode < currentRightNode(左边小 → 左边优先)

        如果返回 0:两者相等

        如果返回 正数currentLeftNode > currentRightNode(右边小 → 右边优先)

        {

            return currentLeftNode.val-currentRightNode.val;

        }

    };

    public ListNode mergeKLists(List<ListNode> allLists)//其中mergeKLists是平台要求必须以其为名

    {

        if(allLists==null || allLists.size()==0)

        {

            return null;

        }

        //首先通过比较器获取当前每个链表在堆中的节点

        Queue<ListNode> heapListNodePriorityQueue=new PriorityQueue<ListNode>(allLists.size(),ListNodeComparator);

        for(int i=0;i<allLists.size();i++)

        {

            if(allLists.get(i)!=null)

            {

                heapListNodePriorityQueue.add(allLists.get(i));//通过不停的比较 拿到当前所有list列表的最小值的节点

            }

        }

        //虚节点 没有任何意思 只是为了操作方便 类似于单链表的头结点 方便数据的操作

         ListNode vitrualNode=new ListNode(0);

       

        //首先将所有链表的第一个节点拿出来组成堆

         ListNode tail=vitrualNode;

        while(!heapListNodePriorityQueue.isEmpty())

        {

            //拿出当前的最小节点

            ListNode head=heapListNodePriorityQueue.poll();

            tail.next=head;//类似于单链表构成下一个节点

            tail=head;//再以当前节点为起点

            if(head.next!=null)

            {

                heapListNodePriorityQueue.add(head.next);//让其heapListNodePriorityQueue又重新排序

            }

        }

        return vitrualNode.next;

    }

}

http://www.dtcms.com/wzjs/449296.html

相关文章:

  • 如何建设数据报表网站合肥网站建设公司
  • 为了推出企业网站建设seo优化点击软件
  • 手机网站接入微信登录产品线上营销方案
  • 学会网站建设的重要性免费建一个自己的网站
  • .net网站项目有哪些百度百科合作模式
  • 有哪些做简历的网站谷歌账号
  • 页面访问将在5秒后自动跳转360优化大师最新版的功能
  • 山东高密网站建设上海网络推广公司网站
  • 做网站需要到什么技术宝鸡seo外包公司
  • 免费建站的方法广州关于进一步优化疫情防控措施
  • 温州阀门网站建设seo关键词优化排名公司
  • 班级网站网页设计网络营销渠道可分为
  • 怎样收录网站seo实战技巧100例
  • 做电商需要哪些网站有哪些注册域名查询网站官网
  • 普象工业设计网官网seo网站排名全选
  • 做淘宝美工需要知道的网站软件外包企业排名
  • 网站服务器 优帮云比较好的网络优化公司
  • 祭祀网站建设方案百度推广多少钱
  • 长沙网页设计有限公司优化网站性能
  • c web网站开发视频太仓网站制作
  • 怎么做网站推成人专业技能培训机构
  • 管理系统考生端重置密码seo是什么职位缩写
  • 杭州网站设计公司排名中国十大电商平台排名
  • 17网站一起做网店深圳关键词怎么做快速的有排名
  • 4399网站做游戏赚钱百度号注册官网
  • wordpress 修改登录页面优化站点
  • 盗版系统网站怎么建立网站维护推广的方案
  • 做网站怎样实现网上支付石家庄seo网站排名
  • 制作网页网站费用属于资本性支出吗百度推广怎么做免费
  • 自己做网站建设百度知道个人中心