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

算法奇妙屋(五)-链表

一. 力扣 2. 两数相加

1. 题目

在这里插入图片描述

2. 算法原理

在这里插入图片描述

3. 代码

    public ListNode addTwoNumbers(ListNode cur1, ListNode cur2) {ListNode newHead = new ListNode();ListNode tail = newHead;int tmp = 0;while (cur1 != null && cur2 != null) {tmp += (cur1.val + cur2.val);ListNode node = new ListNode(tmp % 10);tmp /= 10;tail.next = node;tail = node;cur1 = cur1.next;cur2 = cur2.next;}while (cur1 != null) {tmp += cur1.val;ListNode node = new ListNode(tmp % 10);tmp /= 10;tail.next = node;tail = node;cur1 = cur1.next;}while (cur2 != null) {tmp += cur2.val;ListNode node = new ListNode(tmp % 10);tmp /= 10;tail.next = node;tail = node;cur2 = cur2.next;}if ((tmp % 10) != 0) {ListNode node = new ListNode(tmp % 10);tail.next = node;}return newHead.next;}

二. 力扣 24. 两两交换链表中的节点

1. 题目

在这里插入图片描述

2. 算法原理

在这里插入图片描述

3. 代码

    public ListNode swapPairs(ListNode head) {if (head == null || head.next == null) {return head;}ListNode newHead = new ListNode();ListNode prev = newHead;ListNode cur = head;ListNode next = cur.next;ListNode nnext = next.next;while (cur != null && cur.next != null) {prev.next = next;next.next = cur;cur.next = nnext;if (nnext == null || nnext.next == null) {break;}prev = cur;cur = nnext;next = nnext.next;nnext = next.next;}return newHead.next;}

三. 力扣 143. 重排链表

1. 题目

在这里插入图片描述

2. 算法原理

在这里插入图片描述

3. 代码

(1) 方法一:从中间点prev处开始逆序

    public void reorderList(ListNode head) {if (head == null || head.next == null || head.next.next == null) {return;}ListNode prev = head;ListNode cur = head;// 寻找中间节点 prevwhile (cur != null && cur.next != null) {cur = cur.next.next;prev = prev.next;}// 逆序头插法ListNode mid = prev;cur = prev;prev = null;while (cur != null) {ListNode curN = cur.next;cur.next = prev;prev = cur;cur = curN;}// 交替合并// 逆序后的 头结点是 prevListNode cur1 = head;ListNode cur2 = prev;cur = new ListNode();while (cur1 != mid && cur2 != null) {cur.next = cur1;cur = cur.next;cur1 = cur1.next;cur.next = cur2;cur = cur.next;cur2 = cur2.next;}}

(2) 方法二:从中间点next处开始逆序

    public void reorderList(ListNode head) {if (head == null || head.next == null || head.next.next == null) {return;}ListNode prev = head;ListNode cur = head;// 寻找中间节点 prevwhile (cur != null && cur.next != null) {cur = cur.next.next;prev = prev.next;}// 逆序头插法cur = prev.next;prev.next = null;prev = null;while (cur != null) {ListNode curN = cur.next;cur.next = prev;prev = cur;cur = curN;}// 交替合并// 逆序后的 头结点是 prevListNode cur1 = head;ListNode cur2 = prev;cur = new ListNode();while (cur1 != null) {cur.next = cur1;cur = cur.next;cur1 = cur1.next;if (cur2 != null) {cur.next = cur2;cur = cur.next;cur2 = cur2.next;}}}

四. 力扣 23. 合并 K 个升序链表

1. 题目

这道题目就是把多个有序链表连接成一个, 这里不过多赘述题意, 直接上算法原理
在这里插入图片描述

2. 算法原理

(1) 算法一:堆排序求解

这里可以用优先级队列, 通过建立小根堆的方法来进行链接
在这里插入图片描述

(2) 算法二:递归分治解法

该解法与归并排序分治的解法思路类似,只是把对两个数组合并的过程变成了两个链表合并
在这里插入图片描述

3. 代码

(1) 方法一代码

    // 堆排序做法public ListNode mergeKLists(ListNode[] lists) {ListNode newHead = new ListNode();ListNode cur = newHead;PriorityQueue<ListNode> priorityQueue = new PriorityQueue<>((v1,v2) -> v1.val - v2.val);for(ListNode head : lists) {if (head != null) {priorityQueue.offer(head);}}// 取出头结点, 并合并while (!priorityQueue.isEmpty()) {cur.next = priorityQueue.poll();cur = cur.next;if (cur.next != null) {priorityQueue.offer(cur.next);}}return newHead.next;}

(2) 方法二代码

    public ListNode mergeKLists(ListNode[] lists) {int n = lists.length;if (n == 0) {return null;}return merge(lists, 0, n - 1);}public ListNode merge(ListNode[] lists, int s, int e) {if (s >= e) {return lists[s];}int mid = (s + e) / 2;// 左面合并ListNode left = merge(lists,s,mid);// 右面合并ListNode right = merge(lists,mid + 1, e);// 合并两个有序链表return sort(left,right);}public ListNode sort(ListNode cur1, ListNode cur2) {ListNode newHead = new ListNode();ListNode cur = newHead;while (cur1 != null && cur2 != null) {if (cur1.val <= cur2.val) {cur.next = cur1;cur1 = cur1.next;}else {cur.next = cur2;cur2 = cur2.next;}cur = cur.next;}if (cur1 != null) {cur.next = cur1;}if (cur2 != null) {cur.next = cur2;}return newHead.next;}

五. 力扣 25. K 个一组翻转链表

1. 题目

题目意思是每k个节点进行逆序,不满足k个节点的不逆序
在这里插入图片描述

2. 算法原理

在这里插入图片描述

3. 代码

    public ListNode reverseKGroup(ListNode head, int k) {ListNode cur = head;int n = 0;while (cur != null) {n++;cur = cur.next;}n = n / k;cur = head;ListNode newHead = new ListNode();ListNode prev = newHead;for (int i = 0; i < n; i++) {ListNode tmp = cur;for (int j = 0; j < k; j++) {ListNode next =  cur.next;cur.next = prev.next;prev.next = cur;cur = next;}prev = tmp;}prev.next = cur;return newHead.next;}
http://www.dtcms.com/a/469299.html

相关文章:

  • 从iPhone转移到itel手机的联系人转移指南
  • MySQL实战篇04_Docker入门实战:从零搭建MySQL容器环境
  • 上海网站制作机构做网站后面维护要收钱吗
  • wget 命令速查手册 | HTTP / FTP 文件下载全指南
  • ffmpeg avio使用示例
  • 我把Excel变成了像素画板!用Python实现图片到单元格的映射
  • Android相册高频面试场景分析
  • 郑州建筑公司网站建设网页制作标准
  • iOS 推送证书 P8 介绍及生成流程
  • Ubuntu22.04安装Ibus的中文输入法
  • 基于STM32的智能物联网加湿器/智能家居
  • 23种设计模式——解释器模式(Interpreter Pattern)
  • 贴吧网站建设个人免费空间申请
  • 机器人能否实现远程视频通话方便家属探视老人
  • 小杰深度学习(ten)——视觉-经典神经网络——LetNet
  • LeetCode每日一题——困于环中的机器人
  • c++11 列表初始化 右值引用 移动语义 引用折叠 完美转发
  • 以太网与工业以太网通信C#开发
  • 14-verilog的SPI主驱动
  • vue项目安装chromedriver超时解决办法
  • 【C++】12.多态(超详解)
  • 【Linux操作系统】进程控制
  • 做实验流程图的网站广州免费核酸采集点时间
  • 网站网页设计公司电子商务公司logo
  • 潮玩盲盒抽赏小程序玩法拆解:不同视角下的增长逻辑分析
  • 使用Milvus和DeepSeek构建RAG demo
  • WD5030A,24V降5V,15A 大电流,应用于手机、平板、笔记本充电器
  • wordpress 新浪微博百度网站优化外包
  • Oracle LOB使用入门和简单使用,提供学习用的测试用例!
  • Java版旅游系统/文旅系统/旅游助手/旅游攻略/公众号/小程序/app全套源码