![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
链表
Genius_J
喜欢编程的程序小白
展开
-
单链表操作小结
单链表方法:1、双指针法用两个指针对链表进行操作判断是否有环、求倒数第k位的数、求中间节点、求环的起始点、求两个链表是否有公共部分(相交)等while (slow && fast && fast->next) { slow = slow->next; fast = fast->next->next; if (slow == fast) { return true;原创 2020-10-24 15:10:47 · 166 阅读 · 0 评论 -
leetcode 1367. Linked List in Binary Tree
题意:给出一棵二叉树和一个链表。如果在二叉树中,存在一条完全匹配链表中数值的路径,返回 True ,否则返回 False 。解法:我的解法:将链表保存在数组中,计算出kmp的模式数组,然后对树深度优先搜索,并对节点进行匹配。官方:以二叉树中的每个节点为起点往下遍历的路径是否有与链表相匹配的路径。对当前节点进行匹配,成功返回true,失败返回false。然后对其左右节点进行从头节点开始的链表匹配,递归操作。总结:官方方法更加简洁明了,自己的方法用了kmp,也算是对这了解了一些。kmp的模式数组转载 2020-10-17 16:28:53 · 90 阅读 · 0 评论 -
leetcode 1171. Remove Zero Sum Consecutive Nodes from Linked List
题意:给出一个链表的头节点 ,反复删去链表中由和为 0 的连续节点组成的序列,直到不存在这样的序列为止。删除完毕后,返回最终结果链表的头节点。解法:1:暴力解法将每个元素放到数组中,然后按顺序以每个节点为头结点求和,判断有没有和为0的,有删除相应的数组中的元素,然后从头开始遍历,直到没有和为0的序列。然后将剩下的数按顺序生成一个链表,返回。2:前缀求解法数组的顺序累加求和的每一次结果,如果出现相同则说明中间部分可以抵消。先生成一个虚拟头结点,指向头节点,将map中的0指向该节点,从链表头开始累转载 2020-10-08 16:35:21 · 134 阅读 · 0 评论 -
leetcode 142. Linked List Cycle II
题意:判断一个链表中有没有环,有返回环的起始节点。解法:用快慢指针判断是否是环,不是则返回NULL,是则返回相遇时的节点。然后另设一个节点指向头结点,两个节点同时走一步,走到相同的节点即为环的起始节点。设链表到环的起始节点的距离为x,环内起始节点到快慢指针相遇节点的距离为y,剩下距离为z。则2(x+y)=x+y+z+y2(x+y)=x+y+z+y2(x+y)=x+y+z+y,得到x=zx=zx=z。即第一次相遇时,距离起始节点的距离为x。总结:这一题还可以通过集合来求解,但是这种方法更简洁,空间转载 2020-10-03 15:18:02 · 127 阅读 · 0 评论 -
leetcode 1019. Next Greater Node In Linked List
题意:给出一个链表,下一个更大值:在当前节点后面第一个比它大的数。找出所有节点的下一个更大值,返回结果数组,没有比它大的值为0。解法:我的解法:初始化当前结果数组为0,将链表逆转,比较当前节点的值与下一个节点的值:1、 如果当前节点大,保存到结果数组中,同时设置一个压缩数组用于记录结果数组中相邻不相同的值,即当前值与左右不一样。2、如果下一个节点大,则在压缩数组中从后往前找比下一个节点的值大的数值,由保存结果,同时判断该值与压缩数组中的最后一个数是否相同,不同则保存到压缩数组中。别人的解法:转载 2020-09-20 16:42:12 · 95 阅读 · 0 评论 -
leetcode 445. Add Two Numbers II
题意:两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。假设除了数字 0 之外,这两个数字都不会以零开头。不能对列表中的节点进行翻转。解法:我的解法:建另外一个链表先从最高位到最低位进行相加存储,后面产生的节点插在前面节点的前面,然后遍历链表处理大于10的数和余数,最后要注意判断最后余数是否大于0,是则在最后新增一个节点存放余数,然后将链表翻转。官方解法:用两个栈存储数据后,输出相加,相加的结果产生一个节点,next指向前一转载 2020-09-13 15:47:33 · 90 阅读 · 0 评论 -
leetcode 25. K 个一组翻转链表
题意:给出一个链表,每 k 个节点一组进行翻转,请返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。解法:1、预设一个节点,指向头节点。2、找到第k个节点并保存下一个节点knext后,如果当前节点为NULL停止操作;否则将第k个节点的next设置为NULL,然后对当前节点到第k个节点之间进行反转,将当前节点节点的前一个节点重新指向反转后的链表段的第一个节点,当前节点指向knext节点。3、重复上述操作,直到跳出。总转载 2020-09-12 16:24:12 · 87 阅读 · 0 评论 -
leetcode 147. Insertion Sort List
题意:对链表进行插入排序。解法:我的解法:1、先设置一个节点指向头节点2、cur为当前排序节点,每一次都对链表从头开始进行比较,找到第一个比cur的值大的元素,这个元素前一个位置pre1,元素的位置p,然后将cur前面的元素pre的next指向cur的下一个元素,cur放到p前面。cur改为pre的下一个元素。别人的解法:1、先设置一个节点指向头节点2、cur为当前排序节点,tail为已排好序的最后一个节点,先比较这两个的值,cur大则遍历下一个节点,cur小则从头开始对链表的元素进行比较,转载 2020-08-30 17:46:48 · 121 阅读 · 0 评论 -
leetcode 148. Sort List
题意:在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。解法:用归并排序,先求出链表长度,自底向上将链表断开后重新合并。总结:这一题一开始想尝试用快排,将链表中的元素根据大小移到其前后,操作起来很复杂,最后还有一些例子没有通过。看了一下解法,用的是归并排序。原来用数组的时候,发现归并排序挺费空间的。这题用链表发现,不仅不费空间,操作起来比数组的排序要简单一些。链表的相关操作还是不熟练,比如将一个元素在链表中前后移动。...转载 2020-08-29 16:51:23 · 78 阅读 · 0 评论 -
leetcode 02.07. Intersection of Two Linked Lists LCCI
题意:求两个链表的交集,是引用相同,不是值相同,即后面引用了相同的链表。解法:我的解法:分别求出两个链表的长度,然后将长度长的先循环两个链表长度的差值次数,然后同时遍历找到相同的引用的开始点。别人的解法:用两个指针分别指向两个链表,然后开始遍历判断,无论哪个先遍历完,然后指向另一个链表进行遍历。(有点像将AB两个链表串联起来,一个是AB,另一个是BA,然后遍历,因为长度一样,排除了两个链表长度不一样带来的问题,保证AB和BA的尾部是对齐的。) ListNode* hA =headA;转载 2020-08-23 16:10:20 · 113 阅读 · 0 评论 -
leetcode 剑指 Offer 35. 复杂链表的复制
题意:将一个链表复制一遍后输出,这个链表除了next指针外,还有一个random指针,随机指向链表中的元素(包括自身或者)转载 2020-08-22 15:56:09 · 302 阅读 · 0 评论