LeetCode算法练习top100:(4)链表

package top100.top链表;import top100.ListNode;
import top100.Node;import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.HashMap;public class TOP {//160. 相交链表//hashmap方法太low了//判断链表是否相交//双指针遍历两个相交链表,如果有相遇点,路径节点数一定相同public ListNode getIntersectionNode(ListNode headA, ListNode headB) {if (headA == null || headB == null) {return null;}ListNode cur1 = headA, cur2 = headB;while (cur1 != cur2) { //如果相交,则一定会有cur1 = cur2,如果不相交,cur1 = cur2 = nullcur1 = cur1 == null ? headB : cur1.next;cur2 = cur2 == null ? headA : cur2.next;}return cur1;}//206. 反转链表public ListNode reverseList(ListNode head) {if (head == null) return null;ListNode pre = null, cur = head;while (cur != null) {ListNode next = cur.next;cur.next = pre;pre = cur;cur = next;}return pre;}//234. 回文链表//方法很多,反转链表,或者取出数据再判断public boolean isPalindrome(ListNode head) {if (head == null) {return true;}ArrayList<Integer> list = new ArrayList<>();while (head != null) {list.add(head.val);head = head.next;}for (int i = 0; i < list.size() / 2; i++) {int a = list.get(i);int b = list.get(list.size() - 1 - i);if (a != b) {return false;}}return true;}//反转链表的前一半再同时便利两部分public boolean isPalindrome(ListNode head) {if(head == null || head.next == null) return false;ListNode pre = null;ListNode slow = head, fast = head;//遍历的时候同时反转,很妙while(fast != null && fast.next != null){// 快指针每次前进两步fast = fast.next.next;// 每次循环将局部链表反转ListNode tmp = slow.next;slow.next = pre;pre = slow;slow = tmp;}// 1.偶数链表循环结束后,fast == null,// pre指向前半部分第一个回文数,slow指向后半部分第一个回文数// 2. 奇数链表循环结束后,fast !=null, fast.next == null// pre指向前半部分第一个回文数,slow指向后半部分第一个链表。// 要将slow向前推进一步if(fast != null) slow = slow.next;// 此时pre指向前半部分第一个回文数,slow指向后半部分第一个回文数while (pre != null || slow != null){if(pre.val != slow.val) return false;pre = pre.next;slow = slow.next;}return true;}//141. 环形链表//链表是否有环:快慢指针,如果有环,肯定会相遇public boolean hasCycle(ListNode head) {if (head == null) {return false;}ListNode slow = head, fast = head;while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;if (slow == fast) {return true;}}return false;}//142. 环形链表 II//链表的环:hashmap 或者 双指针public ListNode detectCycle(ListNode head) {if (head == null) {return null;}ListNode slow = head, fast = head;while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;if (slow == fast) { //遇到环,快指针重新走fast = head;while (fast != slow) {slow = slow.next;fast = fast.next;}return slow;}}return null;}//21. 合并两个有序链表public ListNode mergeTwoLists(ListNode list1, ListNode list2) {if (list1 == null) {return list2;}if (list2 == null) {return list1;}ListNode temp = new ListNode(-1);ListNode cur = temp;while (list1 != null && list2 != null) {if (list1.val < list2.val) {cur.next = list1;list1 = list1.next;} else {cur.next = list2;list2 = list2.next;}cur = cur.next;}if (list1 != null) {cur.next = list1;}if (list2 != null) {cur.next = list2;}return temp.next;}//2. 两数相加public ListNode addTwoNumbers(ListNode l1, ListNode l2) {int carry = 0;ListNode fake = new ListNode(-1);ListNode pre = fake;while(l1 != null || l2 != null || carry != 0) {int num1 = l1 == null ? 0 : l1.val;int num2 = l2 == null ? 0 : l2.val;ListNode cur = new ListNode((num1 + num2 + carry) % 10);pre.next = cur;pre = cur;carry = (num1 + num2 + carry) / 10;l1 = l1 == null ? null : l1.next;l2 = l2 == null ? null : l2.next;}pre.next = null;return fake.next;}//19. 删除链表的倒数第 N 个结点public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dummy = new ListNode(-1);dummy.next = head;//双指针ListNode slow = head;ListNode fast = head;//fast先移动n个,再同时移动fast和slow,使fast在最后一个结点,则slow就是倒数第n个for (int i = 0; i < n; i++) {fast = fast.next;}ListNode pre = dummy;while (fast != null) {pre = slow;slow = slow.next;fast = fast.next;}pre.next = slow.next;return dummy.next;}//24. 两两交换链表中的节点//用了k个一组反转链表的方法public ListNode swapPairs(ListNode head) {if (head == null) return null;if (head.next == null) return head;ListNode dummy = head.next;ListNode next = dummy.next;//翻转dummy.next = head;head.next = swapPairs(next);return dummy;}//25. K 个一组翻转链表public ListNode reverseKGroup(ListNode head, int k) {if (head == null) return null;//计算结点是否有k个ListNode cur = head;for (int i = 0; i < k; i++) {if (cur == null) {return head;}cur = cur.next;}//翻转k个节点ListNode pre = null;cur = head;int count = 1;while (count <= k) {ListNode next = cur.next;cur.next = pre;pre = cur;cur = next;count++;}//拼接head.next = reverseKGroup(cur, k);return pre;}//138. 随机链表的复制public Node copyRandomList(Node head) {if (head == null) {return null;}//HashMap记录两个链表的对应情况HashMap<Node, Node> map = new HashMap<>();Node cur = head;while (cur != null) {map.put(cur, new Node(cur.val));cur = cur.next;}cur = head;while (cur != null) {map.get(cur).next = map.get(cur.next);map.get(cur).random = map.get(cur.random);cur = cur.next;}return map.get(head);}//148. 排序链表//链表的归并排序public ListNode sortList(ListNode head) {if (head == null || head.next == null) return head;//链表分割为两部分:快慢双指针//如果链表是偶数, 则需要找到中间节点的第一个//如果是找到链表中间节点的第二个,则可以去掉fast.next.next条件ListNode slow = head, fast = head;while (fast.next != null && fast.next.next != null) {fast = fast.next.next;slow = slow.next;}ListNode temp = slow.next;//slow就是中间节点的第一个slow.next = null; //断开链表//递归排序两个链表ListNode left = sortList(head);ListNode right = sortList(temp);//合并排序后的链表ListNode dummy = new ListNode(-1);ListNode cur = dummy;while (left != null && right != null) {if (left.val < right.val) {cur.next = left;left = left.next;} else {cur.next = right;right = right.next;}cur = cur.next;}//剩余部分添加到后面cur.next = left != null ? left : right;return dummy.next;}//23. 合并 K 个升序链表//归并排序链表数组,最终实现两两合并链表public ListNode mergeKLists(ListNode[] lists) {if (lists.length == 0) return null;return mergeKLists(lists, 0, lists.length - 1);}private ListNode mergeKLists(ListNode[] lists, int left, int right) {//只有一个链表时,有序,返回该列表的头节点if (left == right) return lists[left];//递归int mid = left + (right - left) / 2;ListNode node1 = mergeKLists(lists, left, mid);ListNode node2 = mergeKLists(lists, mid + 1, right);//合并ListNode dummy = new ListNode(-1);ListNode cur = dummy;while (node1 != null && node2 != null) {if (node1.val < node2.val) {cur.next = node1;node1 = node1.next;} else {cur.next = node2;node2 = node2.next;}cur = cur.next;}cur.next = node1 == null ? node2 : node1;return dummy.next;}//146. LRU 缓存class LRUCache {//需要一个hashmap记录数据//需要对key值按照使用的顺序排序:双向链表,队列等int capacity;HashMap<Integer, Integer> map;ArrayDeque<Integer> deque; //最近使用的数据放在队首public LRUCache(int capacity) {this.capacity = capacity;this.map = new HashMap<>();this.deque = new ArrayDeque<>();}public int get(int key) {if (map.containsKey(key)) {//最近使用了数据,放到队首deque.remove(key);deque.offerFirst(key);return map.get(key);} else {return -1;}}public void put(int key, int value) {if (map.containsKey(key)) {map.put(key, value);deque.remove(key);} else {if (map.size() == capacity) {//新加入数据导致超出容量,删除队尾的数据map.remove(deque.pollLast());}map.put(key, value);}//新加入的数据或者更新的数据都放在队首deque.offerFirst(key);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/144223.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenSign:安全可靠的电子签名解决方案 | 开源日报 No.76

microsoft/Web-Dev-For-Beginners Stars: 71.5k License: MIT 这个开源项目是一个为期 12 周的全面课程&#xff0c;由微软云倡导者团队提供。它旨在帮助初学者掌握 JavaScript、CSS 和 HTML 的基础知识。每一节都包括预习和复习测验、详细的书面指南、解决方案、作业等内容。…

图解分布式事务实现原理(一)

参考 本文参考https://zhuanlan.zhihu.com/p/648556608&#xff0c;在小徐的基础上做了个人的笔记。 分布式事务场景 事务核心特性 在聊分布式事务之前&#xff0c;我们先理清楚有关于 “事务” 的定义. 事务 Transaction&#xff0c;是一段特殊的执行程序&#xff0c;其需…

OceanBase杨冰:完全自研,才能逢山开路遇水搭桥

11月16日&#xff0c;在OceanBase2023年度发布会上&#xff0c;OceanBase CEO杨冰介绍&#xff0c;中国数字经济的蓬勃发展催生了对分布式数据库的强大需求&#xff0c;这种需求也牵引了OceanBase坚定投入自主研发&#xff0c;从而推动树立了分布式数据库的四项新标准。 据了解…

PLC电力载波通讯,一种新的IoT通讯技术

前言: PLC-IoT 是 PLC 技术应用在物联场景的创新实践,有效解决电力线路信号干扰、衰减问题,支持 IP 化通信能力,使能终端设备智能化,构建智慧边缘联接。PLC让传统IoT有了更多的连接可能: 电力线通信技术适用的场景包括电力配用电网络、城市智慧路灯、交通路口信号灯、园…

Linux Shell 通配符 / glob 模式

1、概念 glob 模式&#xff08;globbing&#xff09;也被称之为 shell 通配符&#xff0c;名字的起源来自于 Unix V6 中的 /etc/glob &#xff08;详见 man 文档&#xff09;。glob 是一种特殊的模式匹配&#xff0c;最常见的是通配符拓展&#xff0c;也可以将 glob 模式设为精…

【ROS导航Navigation】五 | 导航相关的消息 | 地图 | 里程计 | 坐标变换 | 定位 | 目标点和路径规划 | 激光雷达 | 相机

致谢&#xff1a;ROS赵虚左老师 Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 参考赵虚左老师的实战教程 一、地图 nav_msgs/MapMetaData 地图元数据&#xff0c;包括地图的宽度、高度、分辨率等。 nav_msgs/OccupancyGrid 地图栅格数据&#…

js添加dom到指定div之后,并给添加的dom类名,然后设置其样式,以及el-popover层级z-index过高问题解决。

遇到一个需求,Vue项目做一个表格,要求表头与表格内容分开,如下效果所示,表头与表格有个高度间隔边距(箭头所示),因为默认我们的el-table的表头与内容是一起的: 思路:通过querySelector获取el-table__header-wrapper元素,通过createElement创建一个div,通过 newElem…

WebStorm配置less编译wxss或css

文章目录 前言先下载安装less程序&#xff1a;实参&#xff1a;要刷新的输出路径成功 前言 使用WebStorm写微信小程序&#xff0c;wxss写着很麻烦&#xff0c;就想着用less&#xff0c;接下来是配置less编译 先下载安装less npm install -g lessless会安装在你当前目录下(以D…

JPA概述

JPA&#xff08;Java Persistence API&#xff09;是一种用于在Java应用程序中管理关系型数据库的Java标准。它提供了一种将Java对象映射到数据库表的机制&#xff0c;并支持通过面向对象的方式来执行数据库操作。JPA的目标是简化数据库编程&#xff0c;并提供与底层数据库的解…

P1941 飞扬的小鸟

P1941 飞扬的小鸟 Description Flappy Bird 是一款风靡一时的休闲手机游戏。玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度&#xff0c;让小鸟顺利通过画面右方的管道缝隙。如果小鸟一不小心撞到了水管或者掉在地上的话&#xff0c;便宣告失败。 为了简化问题&am…

【数据结构】树与二叉树(十一):二叉树的层次遍历(算法LevelOrder)

文章目录 5.2.1 二叉树二叉树性质引理5.1&#xff1a;二叉树中层数为i的结点至多有 2 i 2^i 2i个&#xff0c;其中 i ≥ 0 i \geq 0 i≥0。引理5.2&#xff1a;高度为k的二叉树中至多有 2 k 1 − 1 2^{k1}-1 2k1−1个结点&#xff0c;其中 k ≥ 0 k \geq 0 k≥0。引理5.3&…

UE5中APlayerController属性与方法列表(翻译中......)

一、属性列表 类型 名称 描述 TObjectPtr< APa... AcknowledgedPawn 用于网络游戏&#xff0c;使客户端可以承认它拥有一个特定的卒。 TArray< FActive... ActiveForceFeedbackEffects TSharedPtr< str... ActiveHapticEffect_Gun TSharedPtr< str..…

大模型幻觉成应用落地难题 最新评测文心一言解决幻觉能力最好文心一言解决幻觉能力最好 或成产业应用首选

“林黛玉倒拔垂杨柳”、“月球上面有桂树”、“宋江字武松”……相信经常使用大语言模型都会遇到这样“一本正经胡说八道”的情况。这其实是大模型的“幻觉”问题&#xff0c;是大模型行业落地的核心挑战之一。例如幻觉会影响生成内容的可靠性&#xff0c;对于法律、金融、医疗…

算法-贪心算法-简单-买卖股票的最佳时机

记录一下算法题的学习4 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这…

预览PDF并显示当前页数

这里写目录标题 步骤实例实例效果图 步骤 1.安装依赖 npm install --save vue-pdf2.在需要的页面&#xff0c;引入插件 import pdf from vue-pdf3.使用 单页pdf可以直接使用 <pdf :src"获取到的pdf地址"></pdf>多页pdf通过循环实现 html标签部分 &l…

【机器学习基础】机器学习入门(1)

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;机器学习 欢迎订阅&#xff01;后面的内容会越来越有意思~ &#x1f4a1;专栏介绍&#xff1a; 本专栏的第一篇文章&#xff0c;当然要介绍一下了~来说一下这个专栏的开…

EDMA的组成及其作用简介

EDMA是什么&#xff1f; 答&#xff1a;EDMA&#xff08;Enhanced Direct Memory Access&#xff09;是一种增强型的直接内存访问技术&#xff0c;用于高效地实现数据传输和处理。它是在传统的DMA&#xff08;Direct Memory Access&#xff09;基础上进行改进和扩展的。DMA是一…

大语言模型量化方法对比:GPTQ、GGUF、AWQ

在过去的一年里&#xff0c;大型语言模型(llm)有了飞速的发展&#xff0c;在本文中&#xff0c;我们将探讨几种(量化)的方式&#xff0c;除此以外&#xff0c;还会介绍分片及不同的保存和压缩策略。 说明&#xff1a;每次加载LLM示例后&#xff0c;建议清除缓存&#xff0c;以…

(四)什么是Vite——冷启动时vite做了什么(源码、middlewares)

vite分享ppt&#xff0c;感兴趣的可以下载&#xff1a; ​​​​​​​Vite分享、原理介绍ppt 什么是vite系列目录&#xff1a; &#xff08;一&#xff09;什么是Vite——vite介绍与使用-CSDN博客 &#xff08;二&#xff09;什么是Vite——Vite 和 Webpack 区别&#xff0…

Java面试题(每天10题)-------连载(32)

目录 设计模式篇 1、工厂方法模式&#xff08;利用创建同一接口的不同实例&#xff09;&#xff1a; 2、抽象工厂模式&#xff08;多个工厂&#xff09; 3、单例模式&#xff08;保证对象只有一个实例&#xff09; 4、原型模式&#xff08;对一个原型进行复制、克隆产生类…