
链表Linked List
文章平均质量分 79
CP Coding
这个作者很懒,什么都没留下…
展开
-
LeetCode 2130. Maximum Twin Sum of a Linked List - 亚马逊高频题24
根据题意,其实就是把一个具有n个(n为偶数)的链表从正中间把链表分成两部分,即为两个节点个数相等的子链表,那么所有的双胞胎节点就是,第一个子链表从头到尾与第二个链表从尾到头一一对应构成一对对双胞胎节点,从这些匹配的双胞胎节点中找出和最大的那一对。原创 2022-04-02 10:15:48 · 909 阅读 · 0 评论 -
LeetCode 460. LFU Cache - 链表(Linked List)系列题30
题目要设计一个Least Frequently Used (LFU)Cache,即最不经常使用缓存,跟146. LRU Cache一样是缓存技术的一种算法。LFU与LRU的不同在于当缓存满了时对要丢弃的数据的处理机制不一样,LFU是把最不经常使用也就是被访问的频率最小的那个单元丢弃,要是有多个单元的被访问频率是一样的,那就遵循LRU规则。原创 2022-01-11 05:48:54 · 116 阅读 · 0 评论 -
LeetCode 146. LRU Cache - 链表(Linked List)系列题29
题目要求设计一个LRU(Least RecentlyUsed) Cache,中文叫最近最少使用缓存。做这题之前可以找一本操作系统的书先了解一下LRU。其核心思想就是当缓存满了的时候,插入新内容之前需要先丢弃最近最少使用的那个单元的内容(即缓存里最长时间没被读或写的那个单元)。如果某一个单元刚被读或写过,那么该单元就变成了缓存里最近使用过的(Most Recently Used)。原创 2022-01-10 05:52:53 · 179 阅读 · 0 评论 -
LeetCode 622. Design Circular Queue - 链表(Linked List)系列题28
题目要求设计一个循环队列(Circular Queue),也就叫环形缓冲区(Ring Buffer) ,是基于FIFO(First In First Out)原则的数据结构,队列的最后一个位置跟第一个位置是相连的形成一个环。像堆栈或队列这样的数据结构,链表无疑是最好的选择。原创 2022-01-09 23:41:36 · 281 阅读 · 0 评论 -
LeetCode 716. Max Stack - 链表(Linked List)系列题27
题目要求设计一个堆栈除了支持一般堆栈具有的接口函数:push(), pop(), top(),还需要支持返回堆栈中的最大值:peekMax(),和弹出堆栈中的最大值:popMax()。本题可以在系统自带的堆栈的基础上实现题目所要求的堆栈。如果不用系统自带的而是让我自己实现一个堆栈的话,通常我们会用双向链表来实现,因为双向链表的插入和删除操作的时间复杂度可以达到在O(1)。原创 2022-01-09 09:45:47 · 303 阅读 · 0 评论 -
LeetCode 708. Insert into a Sorted Circular Linked List - 链表(Linked List)系列题26
题目大意是给定一个循环链表,节点是按升序排好序的,现在要求在适当的位置插入一个数值(插入一个新节点)且要保持链表还是升序的。还有给定的头指针并不一定是指向最小值的那个节点。如果有多个合适的位置可以插入就随便选一个位置插入。如果给定的链表为空则创建一个新节点使其自身形成一个只有单个节点的循环链表并返回该节点指针,否则要返回原来的头指针。原创 2022-01-07 06:41:00 · 310 阅读 · 0 评论 -
LeetCode 328. Odd Even Linked List - 链表(Linked List)系列题25
这题跟143. Reorder List和跟86. Partition List很类似,就是把链表按特定规则分成两组,再合并成一个新链表。题目是要求把一个链表的奇数位置的节点连在一起作为前半部分,然后再在把偶数位置的节点连在一起作为后半部分,最后把两部分连在一起形成一个重组的链表。原创 2022-01-06 23:30:14 · 380 阅读 · 0 评论 -
LeetCode 1836. Remove Duplicates From an Unsorted Linked List - 链表(Linked List)系列题15
本题也是要求删除链表中有值相同的所有节点,与82. Remove Duplicates from Sorted List II不同的是本题给的链表不是有序的,因此有相同值的节点不一定是连续的。基本思路就是先找出出现过多次的数值,然后再将对应的节点删掉。可以通过两次遍历来解决,第一次遍历可以用一个hashmap来记录数值出现的次数,第二次遍历把数值出现次数大于1的节点删掉。原创 2022-01-03 02:24:48 · 728 阅读 · 0 评论 -
LeetCode 426. Convert Binary Search Tree to Sorted Doubly Linked List - 链表(Linked List)系列题24
题目要求把一棵二叉搜索树转换成一个循环双向链表。具体要求是一个节点的左指针left指向其前继(predecessor),右指针right指向后继(successor)。最后头节点的left指向尾节点,尾节点的right指向头节点。如果熟悉前继和后继的概念就会知道最后链表是排好序递增的,其实就是二叉搜索树的中序遍历的顺序。很显然又是可以用递归法或迭代法。原创 2022-01-06 11:57:39 · 365 阅读 · 0 评论 -
LeetCode 114. Flatten Binary Tree to Linked List - 链表(Linked List)系列题22
题目要求把一棵二叉树转换成以根节点为头节点的链表,但是不能新创链表节点,要仍然以二叉树的节点为链表的节点,即二叉树节点的右子节点为链表节点的next,二叉树节点的左子节点指向空。另外还要求链表的节点顺序是按照二叉树前序遍历的顺序。既然要求是二叉树前序遍历的顺序,那就按照前序遍历算法来按顺序处理每个节点,有递归和迭代两种方法。原创 2022-01-05 21:08:17 · 239 阅读 · 0 评论 -
LeetCode 114. Flatten Binary Tree to Linked List - 时间复杂度O(1)解法 - 链表(Linked List)系列题23
这题还进一步问到能否做到空间复杂度是O(1)。在之前114. Flatten Binary Tree to Linked List用了递归解法,但是空间复杂度是O(n)。要到达O(1)肯定要用迭代法,然而我们常用的的前序遍历迭代法要用到堆栈,空间复杂度还是达到O(n)。因此要另想办法。原创 2022-01-06 04:01:45 · 244 阅读 · 0 评论 -
LeetCode 109. Convert Sorted List to Binary Search Tree - 链表(Linked List)系列题21
题目大意是把一个排好序的单向链表转换成一棵高度平衡的二叉搜索树。所谓高度平衡就是树里任意一个节点的左右子树的高度相差不超过1。原创 2022-01-05 06:26:16 · 190 阅读 · 0 评论 -
LeetCode 24. Swap Nodes in Pairs - 链表(Linked List)系列题5
题目大意:给定一个链表,要求把相邻的节点两两互换位置。是互换节点而不是改变节点值。本题可以用递归和迭代两种解法。解法1:递归法,当链表里节点个数小于等于1时,不需要处理直接返回。否则把链表分成两部分:前两个节点和剩余链表部分。将前两个节点互换位置,链表剩余部分看成一个新的链表做递归处理,处理完之后原来的头节点变成新的第二个节点并指向递归返回的头节点,原来的第二个节点变成了新的头节点并指向原来的头节点。原创 2021-12-31 22:38:21 · 749 阅读 · 0 评论 -
LeetCode 148. Sort List (快速排序法) - 链表(Linked List)系列题20
在刷这题时除了用归并排序148. Sort List,还想过用快速排序(Quick Sort)法,其核心思想是选择一个顶点然后进行分区,把小于顶点值的所有节点以及顶点归到前半部分,把大于等于顶点值的所有节点归到后半部分,如果两个部分是有序的,那只要把前后两部分尾首相连整个链表就是有序的了。通过递归调用不停的分区直到最后只剩0或1个节点时就可以停止返回,再依次合并返回,最后实现整个链表排序。原创 2022-01-05 02:36:30 · 436 阅读 · 0 评论 -
LeetCode 148. Sort List - 链表(Linked List)系列题19
这题还是要求对链表做排序,不像147. Insertion Sort List指定要用插入排序。这题可以自己选择排序算法,但要求时间复杂度是O(n*logn),很显然插入排序的O(n^2)无法满足要求。试跑了一下147. Insertion Sort List的代码果然超时。由于指定要达到O(n*logn),在众多排序算法中首先想到的会是归并排序(merge sort)原创 2022-01-04 23:23:35 · 231 阅读 · 0 评论 -
LeetCode 147. Insertion Sort List - 链表(Linked List)系列题18
题目指定要用插入排序法对链表进行排序。这跟数组的插入排序法的思路差不多。从链表头到尾依次处理每个节点,对于一个正要处理的当前节点(表示它前面的节点已经处理完成是排好序的),要做的是找到在它之前可以插入的位置。原创 2022-01-04 20:10:26 · 280 阅读 · 0 评论 -
LeetCode 142. Linked List Cycle II - 链表(Linked List)系列题17
当然也可以用快慢指针法来解决,但是用快慢指针发现环存在后,该如何确定环的起始节点呢?答案是;让慢指针每次走一步,快指针每次走两步,当两个指针相遇时停下,这时快慢指针所在的位置到环的起始点的距离,跟头节点到环的起始点的距离刚好相等。这时再用一个指针从相遇点,另外一个指针从头节点同时出发每次走一步,它们再次相遇时就是要找的环的起始点。原创 2022-01-04 02:28:51 · 296 阅读 · 0 评论 -
LeetCode 141. Linked List Cycle - 链表(Linked List)系列题16
题目要求检查一个链表是否存在环。解法一,最容易想到的方法就是遍历链表,用set来记录访问过的节点,要是碰到某一个节点已经在set了说明存在环,要是链表没有环则遍历最终会走到链表尾而终止。原创 2022-01-03 05:05:59 · 305 阅读 · 0 评论 -
LeetCode 143. Reorder List - 链表(Linked List)系列题14
题目要求重组一个链表,把链表节点从中间分成前后两个部分,把后半部分的节点颠倒顺序,然后挨个插入前半部分每两个节点之间。根据题意,解题思路跟LeetCode 86. Partition List有点类似,都是先把链表分成两部分然后按一定规则再合并成一个链表。原创 2022-01-03 01:18:29 · 302 阅读 · 0 评论 -
LeetCode 86. Partition List - 链表(Linked List)系列题13
题目大意:给定一个链表和一个指定值x,要求把链表分成前后两部分,所有小于x的节点在前,所有大于等于x的节点在后,要求两个部分里的节点前后顺序要保持跟原链表一致。解法比较容易想到,定义两个临时链表,遍历原链表,要是当前节点值小于x则把其放入第一个临时链表中,否则放入第二个临时链表。最后把第一个临时链表的结尾连到第二临时链表的开头,就实现了对原链表的分区。原创 2022-01-02 12:00:41 · 372 阅读 · 0 评论 -
LeetCode 61. Rotate List - 链表(Linked List)系列题12
题目说给定一个链表,将其向右选择旋转K个位置。所谓向右旋转就是每个节点向右移动,链表尾节点再向右移动就变成链表的头节点。因此可以把链表首尾相连变成一个环,然后再去找向右移动K个位置后新的头节点和尾节点,在新的尾节点和新的头节点之间断开就形成了移动后的新的链表。原创 2022-01-02 06:55:49 · 225 阅读 · 0 评论 -
LeetCode 82. Remove Duplicates from Sorted List II - 链表(Linked List)系列题11
这题跟LeetCode 83. Remove Duplicates from Sorted List的不同之处在于本题要求把具有相同值的所有节点都删掉。同样的对于一个排好序的链表,值相同的节点在链表中一定都是连续的,因此对于一个节点可以一次找出值与其相同的所有节点,然后把它们删掉。本题也有迭代和递归两种解法。原创 2022-01-02 03:41:01 · 573 阅读 · 0 评论 -
LeetCode 83. Remove Duplicates from Sorted List - 链表(Linked List)系列题10
题目大意:给定一个排好序的链表,对于有相同值的所有节点,删掉多余的节点只保留其中一个节点。解题思路:首先对于一个排好序的链表,值相同的节点在链表中一定都是连续的,这位我们删除节点提供很大方便。同样有迭代和递归两种解法。原创 2022-01-02 00:37:58 · 454 阅读 · 0 评论 -
LeetCode 203. Remove Linked List Elements - 链表(Linked List)系列题9
题目要求删除链表中值等于给定值的所有节点。删除节点是链表的最基本操作需要熟练掌握。本题同样也是有迭代和递归两种解法。原创 2022-01-01 21:49:39 · 198 阅读 · 0 评论 -
LeetCode 92. Reverse Linked List II - 链表(Linked List)系列题8
给定一个链表,只反转指定部分,如给定起始位置left和终止位置right,要求只反转从left到right之间(包含left和right)的节点。并且要求只能遍历一次链表。这题要是left=1,right=n那就变成LeetCode 206. Reverse Linked List了,因此解题思路类似,可以用两个指针对[left, right]范围内的节点做反转操作。关键点是确定起始和终止位置,以及处理完后跟前后节点的链接。原创 2022-01-01 20:28:52 · 407 阅读 · 0 评论 -
LeetCode 206. Reverse Linked List - 链表(Linked List)系列题7
题目要求反转一个链表,并要求分别用迭代法和递归法解答。迭代法:基本思路就是遍历整个链表,让当前节点next指向其父节点。用两个指针实现颠倒顺序,一个指针指向当前节点,另一个指针指向当前节点的父节点(一开始当前节点是头节点则其父节点为空)。在一个循环里,先暂存当前节点的子节点,然后让当前节点next指向其父节点,父节点指针更新为当前节点,当前节点指针更新为之前暂存的子节点,进入下一个循环,直到当前节点为空。原创 2022-01-01 08:37:54 · 432 阅读 · 0 评论 -
LeetCode 25. Reverse Nodes in k-Group - 链表(Linked List)系列题6
题目给定一个链表,要求每一次反转k个节点(即颠倒顺序),最后要是剩下节点数不够k个则不做处理保持原顺序。先来看一个特例,如果k等于2那就变成了LeetCode 24. Swap Nodes in Pairs,因此本题的解题思路也是一样的,可以用递归或迭代法解答。递归法比较简洁易懂,就是把链表分成两部分:前k个节点和剩余链表部分。将前k个节点做颠倒顺序处理,链表剩余部分看成一个新的链表做递归处理。原创 2022-01-01 01:55:25 · 445 阅读 · 0 评论 -
LeetCode 23. Merge k Sorted Lists - 链表(Linked List)系列题4
这题是LeetCode 21. Merge Two Sorted Lists的拓展,要合并不再是两个而是k个有序链表。其实解题思路是一样的,用k个指针分别指向k个有序链表的头节点,然后从k个指针指向的当前节点值中找到值最小的节点,该节点就是所有节点最小,可以被取出放入结果。这种解法的一个关键问题是如何快速地从K个节点中找到值最小的那个?原创 2021-12-30 02:11:07 · 387 阅读 · 0 评论 -
LeetCode 21. Merge Two Sorted Lists - 链表(Linked List)系列题3
解题思路:跟合并两个有序数组是一样的。用两个指针分别指向两个链表头,比较两个指针指向的当前节点值,值小的那个肯定是两个链表剩下所有节点中最小的那个,把该节点取出放入结果中,指针指向该节点的下一个节点,然后继续比较两指针指向的当前节点值,如此反复直到其中一个指针走到链表结尾,把另一个链表剩下的所有节点一次都放入结果中,这样就完成了两个有序链表的合并。原创 2021-12-30 01:40:48 · 506 阅读 · 0 评论 -
LeetCode 19. Remove Nth Node From End of List - 链表(Linked List)系列题2
题目大意:给定一个链表,要求删掉倒数第n个节点,题目给出的限制条件是,保证链表不为空,n大于等于1且小于等于节点总数,即要删除的倒数第n个节点一定存在,这样我们在解答时就不用做边界判断。原创 2021-12-29 05:20:31 · 161 阅读 · 0 评论 -
LeetCode 2. Add Two Numbers - 链表(Linked List)系列题1
题目大意:用两个非空链表来表示两个非负整数,链表的一个节点表示数字的其中一位,数字在链表中是以反顺序存储的,即最低位在前最高位在后。要求相加两个数把和存到一个新链表中。原创 2021-12-29 00:07:10 · 327 阅读 · 0 评论