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

有创意的设计产品seo矩阵培训

有创意的设计产品,seo矩阵培训,公司网站修改怎么做,小程序制作那个好目录 合并 K 个升序链表 解题思路 ListNode 数组方式给出 k 个链表 ArrayList 方式给出 k 个链表 ArrayList常见操作 合并 K 个升序链表 题目描述 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后…

目录

合并 K 个升序链表 

解题思路 

ListNode 数组方式给出 k 个链表

ArrayList 方式给出 k 个链表 

ArrayList常见操作


合并 K 个升序链表 

题目描述

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例 1

输入:lists = [[1,4,5],[1,3,4],[2,6]]

输出:[1,1,2,3,4,4,5,6]

        有两种方式给出 k 个链表,一种是以 ListNode 数组的方式给出链表,另一种方式是以 List Node 顺序表的方式给出,本文以 合并 k 个升序链表为例,顺便复习 ArrayList

解题思路 

        对于 k 个有序链表的合并,其实就相当于对这 k 个链表首先两两进行合并,得到合并后的     k / 2个链表,之后继续对这 k / 2 的链表进行合并,得到 k / 4 个链表,对其以此类推一直进行合并,直到为数量为 1 为止,这个链表就是 k 个链表合并后的结果。 

        其关键在于:1、如何对两个链表进行合并,对于该问题可以在leetcode中练习:合并两个有序链表,在该题目中,我们将两个链表进行合并封装成一个函数;2、如何对 1 中的函数传参,这是每次传入哪两个链表,这里有两种方式:①一种是将相邻的两个链表传入,②另一种是每次传入最左边和最右边这两个链表。

ListNode 数组方式给出 k 个链表

        以下代码给出了两种传入两个链表的方式,第一种将相邻的两个链表传入借助 for 循环即可实现,第二种每次传入最左边和最右边这两个链表,借助双指针即可实现,具体见下列代码. 

    /*** 每次传入最左边和最右边的链表*/public ListNode mergeKLists(ListNode[] lists) {if (lists == null || lists.length == 0) {return null;}int len = lists.length;while (len > 1) {int index = 0;int left = 0;int right = len - 1;while (left < right) {lists[index++] = merge(lists[left], lists[right]);left++;right--;}if (left == right) {lists[index++] = lists[left];}len = index;}return lists[0];}/*** 每次将相邻的两个链表传入*/public ListNode mergeKLists(ListNode[] lists) {if (lists == null || lists.length == 0) {return null;}int len = lists.length;while (len > 1) {int index = 0;for (int i = 0; i < len; i += 2) {if (i == len - 1) {lists[index++] = lists[i];} else {lists[index++] = merge(lists[i], lists[i + 1]); }}len = index;}return lists[0];}private ListNode merge(ListNode head1, ListNode head2) {if (head1 == null || head2 == null) {return head1 == null ? head2 : head1;}ListNode newHead = new ListNode(-1); // 虚拟节点ListNode cur = newHead;while (head1 != null && head2 != null) {if (head1.val > head2.val) {cur.next = head2;head2 = head2.next;cur = cur.next;} else {cur.next = head1;head1 = head1.next;cur = cur.next;}}cur.next = head1 == null ? head2 : head1;return newHead.next;}

ArrayList 方式给出 k 个链表 

ArrayList常见操作

1. boolean add(E e)    // 尾插 e 

2. void add(int index, E e)  // 在 index 位置插入 e

3. E remove(int index)  // 删除 index 位置的元素

4. E get(int index)  // 获取 index 下标的元素

5. E set(int index, E e)  // 将 index 下标的值改为 e

6. void clear()  // 清空所有元素

7. boolean contains(Object o)  // 判断 o 是否在线性表中

8. int indexOf(Object o)  // 返回第一个 o 的下标

9. int lastIndexOf(Object o)  // 返回最后一个 o 的下标

        对于该题, 可以以 ArrayList 的方式传入要合并的链表, 实现思路与以数组方式传入链表一样,但需要熟悉 ArrayList 相关的操作,具体代码实现方式如下:

    /*** 每次传入最左边和最右边的链表*/public static ListNode mergeKLists(ArrayList<ListNode> lists) {if (lists == null || lists.size() == 0) {return null;}int len = lists.size();while (len > 1) {int index = 0;int left = 0;int right = len - 1;while (left < right) {lists.set(index++, merge(lists.get(left), lists.get(right)));left++;right--;}if (left == right) {lists.set(index++, lists.get(left));}len = index;}return lists.get(0);}/*** 每次将相邻的两个链表传入*/public static ListNode mergeKLists2(ArrayList<ListNode> lists) {if (lists == null || lists.size() == 0) {return null;}int len = lists.size();while (len > 1) {int index = 0;for (int i = 0; i < len; i += 2) {if (i == len - 1) {lists.set(index++, lists.get(i));} else {lists.set(index++, merge(lists.get(i), lists.get(i + 1)));}}len = index;}return lists.get(0);}private static ListNode merge(ListNode head1, ListNode head2) {if (head1 == null || head2 == null) {return head1 == null ? head2 : head1;}ListNode newHead = new ListNode(-1); // 虚拟节点ListNode cur = newHead;while (head1 != null && head2 != null) {if (head1.val > head2.val) {cur.next = head2;head2 = head2.next;cur = cur.next;} else {cur.next = head1;head1 = head1.next;cur = cur.next;}}cur.next = head1 == null ? head2 : head1;return newHead.next;}

 

 

http://www.dtcms.com/a/567910.html

相关文章:

  • 乐清网站建设哪家好如何用dede做带下单的网站
  • 丽江北京网站建设毕业设计网站做几个
  • 营销型网站建设网站手机佛山网站页面优化
  • 百度推广 网站要备案吗百度seo推广价格
  • 网站制作文件营销型网站 易网拓
  • 东莞网站设计建设正能量网站入口
  • 湖南北山建设集团网站centos7网站开发
  • 网站后台登陆代码销售网站建设实验报告
  • 成都企业网站seo技术做网站推广员必备的条件
  • 学校建设微网站的方案设计响应式网站建设哪里有
  • 广州市研发网站建设多少钱网站影响seo的标签
  • 自由建网站的网络程序建设网站机构
  • 网站如何做sem优化线下推广方法有哪些
  • 烟台开发区建设业联合会网站wordpress 代码规范
  • 外贸型网站建设方法wordpress留学主题
  • 重庆学校网站推广品牌高端网站设计
  • 自己怎么做wap网站wordpress手机端如何使用
  • 网站建设的思想wordpress docker中文文档
  • 金泉网做网站多少钱有哪些网站是响应式的
  • 如何做网站联盟免费建站软件哪个最好
  • 韩语网站建设注意事项做网站公司三年财务预算表
  • 安徽网站建设费用2022年最为成功的营销案例
  • 网站建设设计师的工作内容接单子做网站词
  • 网站建设一个人能做吗php7 mysql wordpress
  • iis如何添加网站做网站的参考书
  • 建设部指定招标网站网站群集约化建设
  • 免费的h5制作网站模板建设银行网站怎么能转账
  • 做一个网站的全部流程做ppt的软件
  • 接设计网站网站主页和子页风格如何统一
  • 网站负责人备案采集照具体要求wordpress新版编辑