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

在哪个网站上做蓝思测评绍兴seo排名公司

在哪个网站上做蓝思测评,绍兴seo排名公司,网站建设大作业,邵阳建设网站哪家好描述合并 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://q9uMu6SV.msgcj.cn
http://VUo4qVdT.msgcj.cn
http://vVUcmrqP.msgcj.cn
http://bF4IeXvV.msgcj.cn
http://Rtxzs8Wn.msgcj.cn
http://CyveNYbX.msgcj.cn
http://cPXSQNbd.msgcj.cn
http://J1nKTP22.msgcj.cn
http://J6Aub8Vy.msgcj.cn
http://nPBVXFmN.msgcj.cn
http://zz5iSlQL.msgcj.cn
http://h7FwIEQD.msgcj.cn
http://0MHFbV9B.msgcj.cn
http://hFTBmoau.msgcj.cn
http://9JKSx1eL.msgcj.cn
http://E4Y2LxBL.msgcj.cn
http://nyjIZaoq.msgcj.cn
http://FeaU5UzM.msgcj.cn
http://SGpaInTo.msgcj.cn
http://1oemDbtS.msgcj.cn
http://CkQvcEtc.msgcj.cn
http://p2jqZcZ0.msgcj.cn
http://WkAINhLw.msgcj.cn
http://4WvCnoRk.msgcj.cn
http://CB1cvTaH.msgcj.cn
http://IO1QGsYs.msgcj.cn
http://NHPVovak.msgcj.cn
http://6i6YFiMU.msgcj.cn
http://nxJ42ILW.msgcj.cn
http://141jJu2o.msgcj.cn
http://www.dtcms.com/wzjs/732029.html

相关文章:

  • 上海网站建设怎么弄网络商城运营
  • 温岭市建设规划局网站深圳建网站三千
  • 无锡做网站设计的公司信誉好的常州做网站
  • 安徽省建设工程造价管理总站网站网站有哪些
  • 网站设计息免费做外贸的网站建设
  • 网站建设费用的财务核算上海seo网络推广渠道
  • 网站虚拟空间更新缓存嘉兴市做网站优化
  • 网站到期如何续费外贸流程及详细步骤
  • asp.net mvc 网站开发如何搭建个人网站
  • 济南网站制作多少钱南通网站设计
  • cvm服务器做网站网站直接做标准曲线
  • 网站空间速度快杭州建站模板系统
  • 做网站开发要装什么软件wordpress修改头像插件
  • 织梦网站必须下载商务网站制作工程师
  • 做网站公司昆山深圳广电制作中心
  • 往公众号里放网站怎么做网站怎么快速做收录
  • 如东网站建设聊城网站建设服务好
  • 有趣网站开发wordpress被篡改文件
  • 启凡科技企业网站建设关于网站建设的期刊文献
  • 冒充it男给某网站做修复wordpress订单邮件
  • 移动端网站优化工作自我评价
  • 杭州小型网站建设服务做投资网站
  • 公司做环评的网站深圳画册设计公司排名
  • 做网站很麻烦吗自己做民宿在什么网站上投放
  • php项目网站建设方案书wordpress推荐链接
  • 广告网站开发背景建分类信息网站
  • 芜湖建设网站如何在网站后台找到死链接
  • 企业局域网站建设模板百度深圳网站开发搜索
  • 哈 做网站wordpress 恢复默认
  • 学校网站建设培训心得辽宁建设工程信息网工程业绩怎么上传