![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LeetCode【链表】
xiaoshijiu333
farewell
展开
-
【LeetCode】扁平化多级双向链表
#LeetCode每日一题【链表专题】扁平化多级双向链表https://leetcode-cn.com/problems/flatten-a-multilevel-doubly-linked-list/分析题目描述得比较复杂,但其实理解了之后,大致意思就是优先遍历子集链表,在往后遍历;基本拿到手就能想到使用递归,判断该节点有无child,有则递归调用自身,没有则直接向下。当递归完之后,在将结果插入之前的链表即可。实现 public Node flatten(Node head) {原创 2022-01-30 16:15:25 · 720 阅读 · 0 评论 -
【LeetCode】链表随机节点——进阶蓄水池算法思想
#LeetCode每日一题【链表专题】链表随机节点https://leetcode-cn.com/problems/linked-list-random-node/分析该题实现并不难,最简单的方法就是遍历获取链表的长度,然后使用map或者list存储各个节点的值,随机获得的时候根据长度生成字符串,在直接从map中获取。代码实现: public class RandomLinkListNode { int length; // map空间换时间 Map<Inte原创 2022-01-29 17:19:09 · 815 阅读 · 0 评论 -
【LeetCode】LRU 缓存
#LeetCode每日一题【链表专题】LRU 缓存https://leetcode-cn.com/problems/lru-cache/分析这题属于算法设计题,考察对哈希以及双向链表的掌握程度。LRU:“最近最少使用”,常用于缓存过期策略,即当缓存内存快溢出的时候,淘汰"最近最少使用"的缓存。借鉴Java中的LinkedHashMap的做法:哈希+双链表;相比于普通的hashmap,linkedhashmap中的节点Node多了一个before、after节点,用于维护双向链表连接各节点表示前原创 2022-01-28 10:40:02 · 1156 阅读 · 0 评论 -
【LeetCode】有序链表转换二叉搜索树
#LeetCode每日一题【链表专题】有序链表转换二叉搜索树https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/分析这道题看到马上就有了思路:找链表中点、切分成两块链表,构造树,树的左节点指向链表左部分,树的右节点指向链表的右部分,再递归处理即可。有一点需要注意的是:将链表分成两部分时,要把中点拿出来当作树的根节点。我之前就犯了这个错,把中点既作为树根节点,有把中点放到了右链表里面,导致最后的结果原创 2022-01-26 16:42:31 · 305 阅读 · 0 评论 -
【链表】寻找链表中点再深化理解和运用
前言在链表相关算法中,经常会遇到寻找链表中点,根据中点分割链表之类的算法;这边记录下寻找链表中点的方法,以及各个指针最终的指向,以便下次再遇到类似的问题时可以直接秒实现 // 常规,三指针找到链表中点,pre为中点,slow为中点右边 ListNode slow = head, fast = head, prev = null; while (fast != null && fast.next != null) { prev .原创 2022-01-26 10:34:58 · 377 阅读 · 0 评论 -
【LeetCode】K 个一组翻转链表
#LeetCode每日一题【链表专题】K 个一组翻转链表https://leetcode-cn.com/problems/reverse-nodes-in-k-group/分析根据给定的k值,将原链表进行分组反转,剩余的不足k的保持不变我这边第一思路是求出了链表的长度,然后根据长度计算出分组数,再对每一组进行反转,最后相互拼接即可实现public ListNode reverseKGroup(ListNode head, int k) { int length = 0;原创 2022-01-25 10:53:22 · 331 阅读 · 0 评论 -
【链表】反转链表再深化理解和应用
前言链表的相关算法题,经常能遇到反转相关的操作:整体反转、局部反转、满足一定条件反转等,需要快速反应反转链表的实现以及各变量的含义实现 /* 快速反应:反转链表几个参数的含义 prev是反转之后的结果 next是下一个节点 head是反转前的第一个节点,也是反转之后的最后一个元素 temp指向next */ public ListNode reverseList(ListNode head) { // 反转链表 L.原创 2022-01-25 10:17:22 · 455 阅读 · 0 评论 -
【LeetCode】删除排序链表中的重复元素 II
#LeetCode每日一题【链表专题】删除排序链表中的重复元素 IIhttps://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/分析两种实现方式:迭代+递归迭代:双指针正常思路双指针:遇到一样的慢指针留下来作为标记,快指针向前走;遇到不一样的,处理:将慢指针的上一个的next置为fast;;所以这里关键的要找到slow的上一个,巧妙的办法就是使用一个哑节点使用第三个指针,初始时指向哑节点,然后随着slo原创 2022-01-24 15:30:18 · 181 阅读 · 0 评论 -
【LeetCode】合并K个升序链表
#LeetCode每日一题【链表专题】合并K个升序链表https://leetcode-cn.com/problems/merge-k-sorted-lists/分析合并两个升序列表,之前已经实现过很多遍了;现在合并K个升序链表,给你一个链表数组,合并成有序的;最容易想到的思路就是:一轮循环,记录结果两两合并实现一// 合并K个有序链表 // 循环、拆分成合并2个有序列表 public ListNode mergeKLists(ListNode[] lists) {原创 2022-01-22 19:59:52 · 431 阅读 · 0 评论 -
【LeetCode】反转链表 II
#LeetCode每日一题【链表专题】反转链表 IIhttps://leetcode-cn.com/problems/reverse-linked-list-ii/分析在反转链表的基础上进行的扩展,将指定位置上的链表进行反转思路:遍历的时候,记录长度,当达到left时,开始反转;大于right之后直接结束;指定区间反转成功之后,在拼接上left之前的以及right之后的即可;所以一轮遍历的时候,记录下left的上一位、left位置以及right的下一位实现public ListNode原创 2022-01-21 19:27:48 · 430 阅读 · 0 评论 -
【LeetCode】相交链表
#LeetCode每日一题【链表专题】相交链表https://leetcode-cn.com/problems/intersection-of-two-linked-lists/分析前面已经实现了环形链表,如何寻找入环的位置。这一道题可以看成是环形链表的衍生题,寻找链表相交的位置:构造环形,headA一轮遍历,首尾相接入环此时就是一个环形链表寻找入环位置的题:使用双指针,一快一慢相遇之后,重置慢指针到起点在重新同时出发,在相遇则为入环位置:详见:https://blog.csdn.n原创 2022-01-20 19:59:42 · 214 阅读 · 0 评论 -
【LeetCode】反转链表
#LeetCode每日一题【链表专题】反转链表https://leetcode-cn.com/problems/reverse-linked-list/分析给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。1——>2——>3——>4——>5变成5——>4——>3——>2——>1实现非递归:一个一个节点的处理,记录上一个节点的位置以及下一个节点的位置,将当前节点的next指向上一个节点 public ListN原创 2022-01-19 20:23:23 · 190 阅读 · 0 评论 -
【LeetCode】排序链表
#LeetCode每日一题【链表专题】排序链表https://leetcode-cn.com/problems/sort-list/分析链表经典排序算法,归并排序和快速排序;两者都是采用“分治”的思想,将整体不断的切分成两部分,直至最小。且时间复杂度都是O(n*logn),空间复杂度O(1)(不同于数组需要开辟新空间);不同点是:归并排序是先切分再排序合并,快速排序是先排序在切分。实现归并排序:1. 使用递归不断的将链表分成两部分,直至长度为1(归)2. 在切分结束之后,不断的原创 2022-01-19 19:32:18 · 387 阅读 · 0 评论 -
【LeetCode】环形链表 II
#LeetCode每日一题【链表专题】环形链表 IIhttps://leetcode-cn.com/problems/linked-list-cycle-ii/分析找到环形链表入环的位置,非环形链表返回null实现一链表经典双指针例题:快慢指针,快指针一次向前两步、慢指针一次向前一步:若有环则快慢指针必会相遇,无环则不会相遇;; 有环相遇则快指针走过的路程是慢指针的两倍,则起点到入环位置和相遇点到入环位置的路程一定相等(数学题)换算到链表即:相遇之后,将慢指针至于头节点,再快慢原创 2022-01-17 17:39:38 · 281 阅读 · 0 评论 -
【LeetCode】重排链表
#LeetCode每日一题【链表专题】重排链表https://leetcode-cn.com/problems/reorder-list/分析需要将一个链表按照(i,n-i)的顺序重新排列1->n-1->2->n-2->3->n-3…实现一难点在于找到i位置对应的n-i位置的节点,首先容易想到的是利用辅助空间栈或者列表,按顺序储存各节点,再一个个拿出来与原链表组合、调整位置public void reorderList(ListNode head)原创 2022-01-17 16:57:37 · 395 阅读 · 0 评论