![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
【链表类题目】
文章平均质量分 75
LeetCode刷题链表类题目总结
Ring*
本科学硬件,研究生学软件!
展开
-
【LeetCode-143】重排链表
因此比较容易想到的一个方法是,我们利用线性表存储该链表,然后利用线性表可以下标访问的特点,直接按顺序访问指定元素,重建该链表即可。因为链表不支持下标访问,所以我们无法随机访问链表中任意位置的元素。注意到目标链表即为将原链表的左半端和反转后的右半端合并后的结果。不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。找到原链表的中点(参考「876.链表的中间结点」)。将原链表的右半端反转(参考「206.反转链表」)。因为两链表长度相差不超过1,因此直接合并即可。将原链表的两端合并。...原创 2022-07-21 21:29:54 · 163 阅读 · 0 评论 -
【LeetCode-234】回文链表
这种方法不仅使用了O(n)的空间,且比第一种方法更差,因为在许多语言中,堆栈帧的开销很大(如Python),并且最大的运行时堆栈深度为1000(可以增加,但是有可能导致底层解释程序内存出错)。而将链表的值复制到数组列表中是O(n),因此最简单的方法就是将链表的值复制到数组列表中,再使用双指针法判断。当快指针移动到链表的末尾时,慢指针恰好到链表的中间。算法的正确性在于递归处理节点的顺序是相反的(回顾上面打印的算法),而我们在函数外又记录了一个变量,因此从本质上,我们同时在正向和逆向迭代匹配。...原创 2022-07-17 22:25:10 · 156 阅读 · 0 评论 -
【LeetCode-206】反转链表
空间复杂度O(n),其中n是链表的长度。空间复杂度主要取决于递归调用的栈空间,最多为n层。时间复杂度O(n),其中n是链表的长度。需要对链表的每个节点进行反转操作。原创 2022-07-17 22:23:41 · 75 阅读 · 0 评论 -
【LeetCode-203】移除链表元素
对于给定的链表,首先对除了头节点head以外的节点进行删除操作,然后判断head的节点值是否等于给定的val。上述过程是一个递归的过程。如果temp的下一个节点不为空且下一个节点的节点值等于给定的val,则需要删除下一个节点。这道题要求删除链表中所有节点值等于特定值的节点,可以用递归实现。如果temp的下一个节点的节点值不等于给定的val,则保留下一个节点,将temp移动到下一个节点即可。当temp的下一个节点为空时,链表遍历结束,此时所有节点值等于val的节点都被删除。...原创 2022-07-17 22:21:14 · 76 阅读 · 0 评论 -
【LeetCode-160】相交链表
如果a≠b,则指针pA会遍历完链表headA,指针pB会遍历完链表headB,两个指针不会同时到达链表的尾节点,然后指针pA移到链表headB的头节点,指针pB移到链表headA的头节点,然后两个指针继续移动,在指针pA移动了a+c+b次、指针pB移动了b+c+a次之后,两个指针会同时到达两个链表相交的节点,该节点也是两个指针第一次同时指向的节点,此时返回相交的节点。如果a=b,则两个指针会同时到达两个链表相交的节点,此时返回相交的节点;...原创 2022-07-17 22:19:59 · 124 阅读 · 0 评论 -
【LeetCode-141】环形链表
因此,我们可以假想一个在head之前的虚拟节点,慢指针从虚拟节点移动一步到达head,快指针从虚拟节点移动两步到达head.next,这样我们就可以使用while循环了。当「乌龟」和「兔子」从链表上的同一个节点开始移动时,如果该链表中没有环,那么「兔子」将一直处于「乌龟」的前方;这样一来,如果在移动的过程中,快指针反过来追上慢指针,就说明该链表为环形链表。每次我们到达一个节点,如果该节点已经存在于哈希表中,则说明该链表是环形链表,否则就将该节点加入哈希表中。,其中N是链表中的节点数。...原创 2022-07-17 22:17:29 · 119 阅读 · 0 评论 -
【LeetCode-24】 两两交换链表中的节点
用head表示原始链表的头节点,新的链表的第二个节点,用newHead表示新的链表的头节点,原始链表的第二个节点,则原始链表中的其余节点的头节点是newHead.next。如果链表中至少有两个节点,则在两两交换链表中的节点之后,原始链表的头节点变成新的链表的第二个节点,原始链表的第二个节点变成新的链表的头节点。给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。两两交换链表中的节点之后,新的链表的头节点是dummyHead.next,返回新的链表的头节点即可。...原创 2022-07-17 22:15:16 · 92 阅读 · 0 评论 -
【LeetCode-02】两数相加
具体而言,如果当前两个链表处相应位置的数字为n1,n2进位值为carry,则它们的和为n1+n2+carry;其中,答案链表处相应位置的数字为(n1+n2+carry)mod10,而新的进位值为。给你两个非空的链表,表示两个非负的整数。此外,如果链表遍历结束后,有carry>0,还需要在答案链表的后面附加一个节点,节点的值为carry。由于输入的两个链表都是逆序存储数字的位数的,因此两个链表中同一位置的数字可以直接相加。如果两个链表的长度不同,则可以认为长度短的链表的后面有若干个00。...原创 2022-07-16 14:46:08 · 50 阅读 · 0 评论 -
【LeetCode-83】删除排序链表中重复元素
具体地,我们从指针cur指向链表的头节点,随后开始对链表进行遍历。否则说明链表中已经不存在其它与cur对应的元素相同的节点,因此可以将cur指向cur.next。当我们遍历到链表的最后一个节点时,cur.next为空节点,如果不加以判断,访问cur.next对应的元素会产生运行错误。由于给定的链表是排好序的,因此重复的元素在链表中出现的位置是连续的,因此我们只需要对链表进行一次遍历,就可以删除重复的元素。当遍历完整个链表之后,我们返回链表的头节点即可。给定一个已排序的链表的头。...原创 2022-07-16 14:43:41 · 125 阅读 · 0 评论 -
【LeetCode-21】合并两个有序单链表
然后,我们重复以下过程,直到l1或者l2指向了null如果l1当前节点的值小于等于l2,我们就把l1当前的节点接在prev节点的后面同时将l1指针往后移一位。由于输入的两个链表都是有序的,所以不管哪个链表是非空的,它包含的所有元素都比前面已经合并链表中的所有元素都要大。当l1和l2都不是空链表时,判断l1和l2哪一个链表的头节点的值更小,将较小值的节点添加到结果里,当一个节点被添加到结果里之后,将对应链表中的节点向后移一位。将两个升序链表合并为一个新的。...原创 2022-07-16 14:39:10 · 1308 阅读 · 1 评论