链表
algsup
这个作者很懒,什么都没留下…
展开
-
leetcode刷题总结之链表
前言:今年过年前的任务就是回顾之前的刷过题,然后弄清以前没有弄懂的知识点,最后归纳整理形成自己的体系。因为“学而不思则罔,思而不学则殆”,在比赛或者面试做题时,只有三种情况,会让你不能ak所有题目,这三种情况分别是:sb失误、不会做、状态不佳。然而写总结所要做的是就是将之前的sb失误减小为0,之前不会做的题做熟做透,摸清套路,至于状态嘛,睡好觉兴奋点就是发挥出真正水平呀。文章目录1、链表2、...原创 2020-01-18 23:10:05 · 9157 阅读 · 10 评论 -
[链表]leetcode328:奇偶链表(medium)
题目:题解:思路:很简单,原地算法,直接遍历改变奇偶节点之间的链接就好了。1)每次循环,将奇数节点链接到偶数节点的next节点,同时更新偶数节点;偶数节点链接奇数节点的next节点,同时更新偶数节点。2)在偶数节点为尾节点或者空节点时,循环退出。这时需要把奇数节点的尾节点链接上偶数节点的头节点即可,这样就完成重装链表了。代码如下:class Solution {public: //思路:原地算法,时间复杂度O(n),空间复杂度O(1) ListNode* oddEve原创 2020-06-29 20:45:39 · 392 阅读 · 0 评论 -
[链表]leetcode234:回文链表(easy)
题目:题解:快慢指针法第一步:快慢指针找到链表的中点第二步:将中点之后的子链表断开且反转第三步:比较判断前半部分和后半部分是否相等即可代码如下:class Solution {public: //题解:快慢指针法,快指针走两步,慢指针走一步,找到链表的中点。然后,翻转后半部分。最后从头、中点开始判断是否相同。 bool isPalindrome(ListN...原创 2020-01-18 22:53:12 · 651 阅读 · 0 评论 -
[链表]leetcode203:移除链表元素(easy)
题目:题解:题解1:递归法,注意递归的三部曲即可得解。题解2:迭代法,遍历链表,若cur的next节点值为val,那么我们就需要删除next节点;否则将cur右移。代码如下:class Solution {public: //题解1:递归法 ListNode* removeElements_1(ListNode* head, int val) { ...原创 2020-01-18 21:44:34 · 375 阅读 · 0 评论 -
[链表]leetcode61:旋转链表(medium)
解题思路:先遍历求出链表的长度,再通过(k%len)找到新的尾节点,形成环形链表,保存新链表的头结点,最后再断开环形链表。class Solution {public: ListNode* rotateRight(ListNode* head, int k) { if(!head) return 0; //指针p来计算链表的长度,指...原创 2019-04-17 22:42:42 · 466 阅读 · 0 评论 -
[链表]leetcode160:相交链表(easy)
题目:题目链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/解题思路:都是利用互换遍历链表的方式来进行相遇的,第一轮指针指向短链表先走完,这就意味着它在第二轮走长的链表会慢下来,这时第一轮长链表的指针便会追上来。代码如下:/** * Definition for singly-linked ...原创 2019-07-26 21:32:27 · 565 阅读 · 0 评论 -
[链表](双指针技巧)leetcode142:环形链表 Ⅱ (medium)
题目:题目链接:https://leetcode-cn.com/problems/linked-list-cycle-ii/解题思路:主要利用leetcode的链表地址由于是由低到高的变化的,如果有环则head->next一定小于head。代码如下:/** * Definition for singly-linked list. * struct ListNode { ...原创 2019-07-26 21:23:05 · 637 阅读 · 1 评论 -
[链表](双指针技巧)leetcode141:环形链表(easy)
题目:题目链接:https://leetcode-cn.com/problems/design-linked-list/解题思路:在环形的条件下快指针必定追上慢指针,快指针的移动速度可以是慢指针的n倍。代码如下:/** * Definition for singly-linked list. * struct ListNode { * int val; * ...原创 2019-07-26 20:49:08 · 788 阅读 · 0 评论 -
[链表]leetcode1171:从链表中删去总和值为零的连续节点(medium)
题目:题解:暴力法原创 2020-01-16 12:00:13 · 760 阅读 · 0 评论 -
[链表]leetcode817:链表组件(medium)
题目:817. 链表组件题解:首先先喷题目,题目意思都没说清楚,链表中一段最长连续结点的值这句话到底是啥意思呢?自己做了第一遍后,发现过不了,然后检查代码也没有发现异常,后来看了评论区才明白题目的意思,所以本题只要懂了题目意思就能马上得解了。题目大意:如果当前的节点在列表G中,并且下一个节点不在列表G中,我们就找到了一个组件的尾节点,将res加1代码如下:class So...原创 2020-01-15 23:55:45 · 397 阅读 · 0 评论 -
[链表][递归]leetcode206:反转链表(easy)
题目:题解:解法1:迭代法主要利用三个指针来完成反转的,节点p保存反转好的节点,节点q是用来完成反转的(即由正向转换为反向),节点r是用来带来p、q遍历链表的,但是注意一点,当r为nullptr时,节点q还没有连上p,所以需要连接一下。解法2:递归法1)递归边界:当head为空节点或单个节点时,返回head节点2)单次过程:head->next->next=head...原创 2019-09-17 18:21:28 · 712 阅读 · 2 评论 -
[链表]leetcode445:两数相加 Ⅱ (medium)
题目:题解:题解1:首先利用反转链表将l1与l2进行反转,然后再利用两个链表之和的反转后的链表进行相加,最后将相加的结果反转就是最终答案了。这个解法有些许繁琐,大家看题解2吧。题解2:双栈法将两个链表节点值全部压入栈中,然后每次去栈顶元素进行相加,因为这样保证了低位和低位相加,不会出现错位现象。最后直到两个栈为空且进位为0为止,就表示相加完成了。代码如下://题解1代...原创 2020-01-15 21:41:49 · 465 阅读 · 0 评论 -
[链表]leetcode725:分割链表(medium)
题目:题解:模拟题,没有考察具体算法,所以直接按题目意思编写代码即可。思路:首先求出链表的长度,然后根据k来求得每段链表的平均长度,顺便求出余数。由于题目要求每部分长度相差不能超过1,而且排在前面的部分长度要大于后面部分的长度,所以我们根据余数的个数,给排在前面的部分长度+1。代码如下:class Solution {public: //思路:先求出链表的长度,然后求...原创 2020-01-15 20:49:24 · 505 阅读 · 0 评论 -
[链表]leetcode2:两数相加(medium)
说明:使用此方法击败90%的人,嘿嘿class Solution {public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { //注意此题,不需要将链表倒置进行加减,因为最后还要倒置回来,所有同学们只需将链表从头加到尾,满10进一即可 ListNode *head=new Lis...原创 2019-04-13 17:03:21 · 833 阅读 · 0 评论 -
[链表]leetcode876:链表的中间节点(easy)
题目:题解:思路1:先求出链表的长度,然后求出中位数所在的位置,最后遍历链表找到中位节点即可思路2:快慢指针,快指针走两步,慢指针走一步,等快指针走到链表尾节点时,慢指针的位置就是中位数的位置代码如下:class Solution {public: //题解1:先求出链表的长度,然后求出中位数所在的位置,最后遍历链表找到中位节点即可 ListNode* ...原创 2020-01-15 20:23:56 · 586 阅读 · 0 评论 -
[链表]leetcode237:删除链表中的节点(easy)
题目:代码如下:class Solution {public: //思路:这题有点沙雕,居然只给一个节点,蒙蔽了好半天,看了评论才知道直接删除node节点就行了 //由于为单向链表我们不能直接删除node节点连接剩余部分,所以我们只能将node的next节点值赋给node,然后删除next节点即可 void deleteNode(ListNode* node) {...原创 2019-12-31 21:15:41 · 161 阅读 · 0 评论 -
[插入排序]leetcode147:对链表进行插入排序(medium)
题目:147. 对链表进行插入排序题解:插入排序注意对于这种打乱链表顺序的题,我们一般都要设置哑节点dummy。思路:我们每次用head->next来进行插入排序,每次插入排序,我们需要从链表的头部开始寻找插入点,所以我们使用一个指针pre来寻找插入点,若pre->next的节点值大于等于head->next的节点时,我们的插入位置就是pre->next,...原创 2019-12-23 11:41:46 · 601 阅读 · 0 评论 -
[归并排序]leetcode148:排序链表(medium)
题目:题解:大家就看看大佬的题解吧,我肯定没大佬讲的好。算法伪代码:current = dummy.next;tail = dummy;for (step = 1; step < length; step *= 2) { while (current) { // left->@->@->@->@->@->@->null ...原创 2019-12-23 10:58:18 · 663 阅读 · 0 评论 -
[链表]leetcode92:反转链表 Ⅱ (medium)
题目:题解:思路:我们需要反转n-m次,每一次我们将head的next节点移动到需要反转链表部分的首部,需要反转链表部分剩余节点依旧保持相对顺序即可。为了编写代码我们需要用pre来记录需要反转链表部分头节点的前驱节点,同时我们也需要设置一个哑节点dummy,因为m=1时,我们可以也有前驱节点。代码如下:class Solution {public: //思路:head...原创 2019-12-21 21:22:53 · 3291 阅读 · 1 评论 -
[链表]leetcode143:重排链表(medium)
题目:题解:暴力法,将链表节点全部存入数组中,然后每次取首尾元素进行相连就好了。代码如下:class Solution {public: //题目意思:每次头尾头尾头尾取元素,组成新的链表 //题解:暴力法,将链表的节点存放在一个数组中,然后每次取首尾元素进行相连就好了 void reorderList(ListNode* head) { ...原创 2019-12-17 22:08:24 · 820 阅读 · 0 评论 -
[链表]leetcode82:删除排序链表中的重复元素 II (medium)
题目:题解:本题的难点在于如何记录重复节点之前的那个节点?比如1->2->3->3->4,我们如何记录3之前的2呢?这里我们需要设置哑头节点的链表用来去除重复节点,用pre来指向不重复元素的节点,遇到重复元素时pre->next指向head->next,注意这里的pre->next是不断更新的,直至指向不重复的节点为止。代码如下:cla...原创 2019-12-15 00:16:58 · 452 阅读 · 1 评论 -
[链表][递归]leetcode83:删除排序链表中的重复元素(easy)
题目:题解:迭代法:遇到重复节点直接删除即可递归法:遇到重复节点覆盖就好了代码如下:class Solution {public: //题解1:迭代法 ListNode* deleteDuplicates_1(ListNode* head) { if(!head||!head->next)return head; List...原创 2019-12-13 21:07:04 · 531 阅读 · 0 评论 -
[链表]leetcode25:K个一组翻转链表(hard)
题目:题解:主要利用了递归的思想,我们将[a.b)范围内k个节点的链表翻转,然后a节点就是翻转后链表的尾节点需要链接剩下的链表节点[b,tail),注意对于区间范围不足k个节点的,不需要进行翻转。代码如下:class Solution {public: ListNode* reverseKGroup(ListNode* head, int k) { if(...原创 2019-11-30 15:12:32 · 507 阅读 · 3 评论 -
[链表][双指针]leetcode86:分隔链表(medium)
题目:题解:双指针法before链表用来存放比x小的节点,after节点用来存放比x大的节点。注意要设置头节点,因为这样可以减少判断条件。代码如下:class Solution {public: //双指针法,before链表存放比x小的节点,after存放比x大的节点 ListNode* partition(ListNode* head, int x) {...原创 2019-11-30 11:10:04 · 1148 阅读 · 0 评论 -
[链表][分治法]leetcode23:合并K个排序链表(hard)
题目:题解:题解1:分治法k个链表利用二分为k个独立的子链表,然后两两组合,最后合并成k个排序链表时间复杂度:O(nlogk),n为单个链表的长度,k表示k个链表题解2:优雅的暴力法利用队列queue来实现两两链表的组合,首先将队列前两个链表合并成一个,然后添加到队列的尾部,直到队列中只有一个链表时,表示k个链表已经合成了。合并两个有序链表的代码可以参考:21.合并...原创 2019-11-21 15:42:46 · 821 阅读 · 0 评论 -
[链表]leetcode21:合并两个有序链表(easy)
题目:题目链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/解题思路:主要采用递归的方法来实现有序链表的实现。代码如下:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *nex...原创 2019-07-26 22:15:14 · 569 阅读 · 0 评论