
链表
abant2
世界上最菜的arcem
展开
-
leetcode 82 83 删除排序链表中的重复元素
先看较为简单的83题,这个题可以保留一个,所以我们每次指向新元素,然后往后看有没有重复的,有重复的就一直往后即可。保证每次处理一个独立的元素。class Solution {public: ListNode* deleteDuplicates(ListNode* head) { if(!head)return head; ListNode *curr = head; while(curr) { List.原创 2021-08-22 23:26:05 · 99 阅读 · 0 评论 -
leetcode 234 回文链表 空间优化
说是个简单题,做起来是真费劲。正常做也没啥事,题目非要要求O(1)空间,就很难受了。做法:反转后面那部分链表,然后用两个指针比较即可。难点一:找到链表中间由于我们要预存链表中间位置,所以分奇数偶数两种情况讨论,用快慢指针找到中间即可。难点二:反转链表反转链表需要存两个指针:前指针和当前指针,每次要处理好这两个的关系,这样当next为空时所有的节点都反转完成。/** * Definition for singly-linked list. * struct ListNode { * .原创 2021-08-03 23:51:10 · 196 阅读 · 1 评论 -
leetcode 206 反转链表
反转链表可以说是最经典的题目之一了。这个问题中,我们要同时考虑三个节点,反转前两个节点,然后继续处理第三个节点。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} *原创 2021-08-02 19:15:29 · 104 阅读 · 0 评论 -
leetcode 160 相交链表 空间优化
这个题一看我就忍不住用map啊,真的是。链表的题实际还是挺有规律的,想这个题,可以发现,如果A走完一圈后走B的路,B走完一圈走A的路,就可以在相交处相遇。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {p.原创 2021-08-02 17:11:43 · 74 阅读 · 0 评论 -
leetcode 287 寻找重复数 类似环形链表
这个题是比较难的一个题,题目要求不允许修改数组,而且常数空间。这里我们就必须用到数组的1到n规定了。注:此题和剑指offer 03很像,但是剑指offer那个题不交换基本是没法做的,此题有不修改数组的解法。此题由于只有一个重复元素,可以使用类似链表的做法,此题其实和环形链表2是一样的,将本身数字当做索引就能一直跳转,由于有重复数字,所以一定能找到环,我们要做的就是找到入环点。代码如下:class Solution {public: int findDuplicate(vector<i.原创 2021-07-28 22:50:54 · 122 阅读 · 0 评论 -
leetcode 142 环形链表2 找环入口 较难数学题
我们使用快慢指针来解决这个问题。设环前路径为a,环长度为b首先,尝试理解第一件事,当两个指针第一次相遇时,慢指针走过的路程是nb。上述结论是可以推导的,设f,s分别为快,慢指针走过的路径,让二者同时出发,f = 2s,并且第一次相遇时 f = s + nb,联立可得出第一个结论、接着来想第二件事,慢指针走多少步才能到入口点?答案是a+nb。第一次相遇时,慢指针已经走了nb了,所以再走a步即可。如何判断走了a步?让一个新指针和慢指针一起走,相遇即可。上述方法不仅能求出入环点,还能得到a的大小。/*.原创 2021-07-28 00:42:31 · 113 阅读 · 0 评论 -
leetcode 141 环形链表 哈希表+快慢指针
题目很容易理解,就是判断链表中有没有环。解法一:快慢指针快指针每次走两步,慢指针每次走一步,如果有环,在环上快指针每次多走一步,一定会相遇。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public.原创 2021-07-27 21:21:26 · 152 阅读 · 0 评论 -
leetcode 146 LRU缓存 链表随机访问
LRU缓存机制就是存键值对,但是会更新,并且要删除最不经常使用的,比如最多开10个应用,开第11个就必须删掉一个最久没用的。要求实现get和put两个O(1)操作,实现办法只有链表加随机访问,否则无法做O(1)的移位。如何实现链表随机访问?要调用c++里的list(双向链表),同时用一个map来做key到迭代器的键值对。注意:list和双端队列函数差不多,可以直接有一个移动的操作,splice,这个比较新。class LRUCache {typedef pair<int, int> .原创 2021-07-23 01:51:51 · 381 阅读 · 0 评论 -
leetcode 19 链表 删除倒数第N个节点
解法一:两次遍历为了防止第一个节点被删掉,使用哑节点作为虚拟头。然后找到链表长度后,再次遍历删除len-n位置即可。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNo.原创 2021-07-22 17:36:42 · 87 阅读 · 0 评论 -
leetcode 92 反转部分链表
这个题是反转一部分链表。咱们希望预存一个在left之前的节点,所以采用哑节点。之后采用链表反转的方法即可,对指针操作后即可完成。注意:l==r时无需反转,而且操作很复杂,直接返回结果即可。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNod原创 2021-03-18 14:07:23 · 152 阅读 · 0 评论 -
leetcode 328 奇偶链表 对地址操作创建新链表
第一次做链表题,确实不咋熟。这里要求O(1)空间复杂度,实际是可以再存第二个链表的,因为只对地址操作就行。知道这点后题目就比较简单了。# Definition for singly-linked list.# class ListNode:# def __init__(self, val=0, next=None):# self.val = val# self.next = nextclass Solution: def oddEvenList(s原创 2020-11-13 10:13:19 · 72 阅读 · 0 评论 -
leetcode 148 链表归并排序 自底向上
此题是经典的链表排序题,链表排序,由于它只能从前向后遍历的特性,很多排序都不能用。比如快速排序,首先找pivot就得遍历一遍,在递归时还需要交换元素,链表交换一个元素可是相当麻烦,递归过程中也会遇到问题,比如新链表头比较难换等。总之,如果用递归做排序,会非常的复杂,有很多细节要处理。此题中用到的归并排序,是目前最快(挺快的,不是最快)的一种排序方法,和快速排序类似。如果陷入递归,也是很麻烦,但我们可以采用自底向上的方法进行归并排序,这样还能减少空间复杂度(没有递归栈)代码如下:# Definition原创 2020-11-24 21:24:08 · 165 阅读 · 0 评论 -
剑指offer 06 倒叙输出链表 先进后出
解法一:双端队列由于插入是O(1)操作,所以插入后转换成list即可。解法二:栈题目要求先进后出,这就是个栈,这样实现会更为简洁。因为栈比较简单,这两个的复杂度应该是相同的。在实际操作中,由于不需要打印,我么把列表反转下即可。...原创 2021-03-09 11:00:41 · 87 阅读 · 0 评论