链表
Sun_Sky_Sea
站在巨人的肩膀上
展开
-
剑指 Offer II 026. 重排链表
剑指 Offer II 026. 重排链表原始题目链接:https://leetcode-cn.com/problems/LGjMqU/给定一个单链表 L 的头节点 head ,单链表 L 表示为:L0 → L1 → … → Ln-1 → Ln请将其重新排列后变为:L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。解题思路:单链表不能随机读取,所以将节点都放在一个线性表中,然后再修改指针的指向。代码实现:原创 2022-04-23 17:16:54 · 345 阅读 · 0 评论 -
1669. 合并两个链表
1669. 合并两个链表原始题目链接:https://leetcode-cn.com/problems/merge-in-between-linked-lists/给你两个链表 list1 和 list2 ,它们包含的元素分别为 n 个和 m 个。请你将 list1 中第 a 个节点到第 b 个节点删除,并将list2 接在被删除节点的位置。解题思路:这道题不难,只要找到list1中的删除片段的前驱节点和后继节点,然后接上list2的起始节点就可以了,具体实现看代码。代码实现:# De原创 2021-05-08 10:11:53 · 77 阅读 · 0 评论 -
1367. 二叉树中的列表
1367. 二叉树中的列表原始题目链接:https://leetcode-cn.com/problems/linked-list-in-binary-tree/给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表。如果在二叉树中,存在一条一直向下的路径,且每个点的数值恰好一一对应以 head 为首的链表中每个节点的值,那么请你返回 True ,否则返回 False 。一直向下的路径的意思是:从树中某个节点开始,一直连续向下的路径。解题思路:这道题使用枚举法去求解,枚举法原创 2021-05-07 22:00:37 · 227 阅读 · 0 评论 -
面试题 02.05. 链表求和
给定两个用链表表示的整数,每个节点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。示例:输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295输出:2 -> 1 -> 9,即912进阶:思考一下,假设这些数位是正向存放的,又该如何解决呢?示例:输入:(6 -> 1 -> 7) + (2 -> 9 -> 5),即617 + 295输出:9 -原创 2021-05-06 16:13:42 · 65 阅读 · 0 评论 -
445. 两数相加 II
445. 两数相加 II原始题目链接:https://leetcode-cn.com/problems/add-two-numbers-ii/给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。进阶:如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。解题思路:题目给出的链表所表示的数字,从左到右是高位到低位,做加法需要从低位到高位开始相加进原创 2021-05-06 15:44:06 · 81 阅读 · 0 评论 -
25. K 个一组翻转链表
25. K 个一组翻转链表原始题目链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group/给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。进阶:你可以设计一个只使用常数额外空间的算法来解决此问题吗?你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。解题思路:首先是要想出反转节点是原创 2021-05-05 14:54:34 · 79 阅读 · 0 评论 -
109. 有序链表转换二叉搜索树
109. 有序链表转换二叉搜索树原始题目链接:https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定的有序链表: [-10, -3, 0, 5, 9],一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示原创 2021-05-04 17:23:07 · 111 阅读 · 0 评论 -
328. 奇偶链表
328. 奇偶链表原始题目链接:https://leetcode-cn.com/problems/odd-even-linked-list/给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。示例 1:输入: 1->2->3->4->5->NULL输出: 1->原创 2021-05-04 16:47:33 · 63 阅读 · 0 评论 -
面试题 02.03. 删除中间节点
面试题 02.03. 删除中间节点原始题目链接:https://leetcode-cn.com/problems/delete-middle-node-lcci/实现一种算法,删除单向链表中间的某个节点(即不是第一个或最后一个节点),假定你只能访问该节点。示例:输入:单向链表a->b->c->d->e->f中的节点c结果:不返回任何数据,但该链表变为a->b->d->e->f解题思路:这道题只知道要删除的链表的节点,不知道表头,删除节点需原创 2021-05-02 15:05:18 · 70 阅读 · 0 评论 -
面试题 02.01. 移除重复节点
面试题 02.01. 移除重复节点原始题目链接:https://leetcode-cn.com/problems/remove-duplicate-node-lcci/编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。示例1:输入:[1, 2, 3, 3, 2, 1]输出:[1, 2, 3]示例2:输入:[1, 1, 1, 1, 2]输出:[1, 2]提示:链表长度在[0, 20000]范围内。链表元素在[0, 20000]范围内。解题思路:使用集合(哈希表)来判断是否原创 2021-04-30 18:04:35 · 107 阅读 · 1 评论 -
剑指 Offer 52. 两个链表的第一个公共节点
剑指 Offer 52. 两个链表的第一个公共节点原始题目链接:https://leetcode-cn.com/problems/liang-ge-lian-biao-de-di-yi-ge-gong-gong-jie-dian-lcof/输入两个链表,找出它们的第一个公共节点。如下面的两个链表:解题思路:先计算两个链表的长度差,然后让较长的链表走长度差的步骤,然后同时遍历两个链表,如果发现两个链表的节点是一样的,直接返回该节点即可,具体实现看代码。代码实现:# Definition原创 2021-04-30 17:30:53 · 63 阅读 · 1 评论 -
面试题 02.02. 返回倒数第 k 个节点
面试题 02.02. 返回倒数第 k 个节点原始题目链接:https://leetcode-cn.com/problems/kth-node-from-end-of-list-lcci/实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。注意:本题相对原题稍作改动示例:输入: 1->2->3->4->5 和 k = 2输出: 4说明:给定的 k 保证是有效的。解题思路:这道题之前剑指offer的一道题是一样的,使用快慢双指针解题即可,具体看代码。原创 2021-04-30 16:41:01 · 48 阅读 · 0 评论 -
剑指 Offer 18. 删除链表的节点
剑指 Offer 18. 删除链表的节点原始题目链接:https://leetcode-cn.com/problems/shan-chu-lian-biao-de-jie-dian-lcof/给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。注意:此题对比原题有改动示例 1:输入: head = [4,5,1,9], val = 5输出: [4,1,9]解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 ->原创 2021-04-30 11:26:36 · 51 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表
剑指 Offer 06. 从尾到头打印链表原始题目链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。解题思路:这道题比较简单,遍历链表,要求从尾到头返回一个列表,所以遍历链表的时候使用双端队列这个数据结构,从头开始插入节点的值即可,题目要求返回的是一个数组。具体实现看代码。代码实现:# Definition for sing原创 2021-04-30 09:57:40 · 50 阅读 · 0 评论 -
61. 旋转链表
61. 旋转链表原始题目链接:https://leetcode-cn.com/problems/rotate-list/给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。解题思路:用闭环的方法是比较巧妙的,先将链表封闭成环,然后找新链表的尾结点的索引,从索引出断开(next域置空),断开前,索引处的下一个节点就是新链表的头结点直接返回即可。找索引(从0开始计算)的位置用一个计算公式,计链表的长度为n:(n1)- (k % n),特别注意的是当k对n求余为0的时原创 2021-04-29 21:52:03 · 66 阅读 · 0 评论 -
剑指 Offer 22. 链表中倒数第k个节点
剑指 Offer 22. 链表中倒数第k个节点原始题目链接:https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。解题思路:这道题很简单,统计一遍链原创 2021-04-29 11:22:09 · 73 阅读 · 0 评论 -
24. 两两交换链表中的节点
24. 两两交换链表中的节点原始题目链接:https://leetcode-cn.com/problems/swap-nodes-in-pairs/给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。解题思路:解链表的题最好是画图,链表的递归解法不好想出来,通过指针迭代遍历是比较好解题的,递归的思想参考了一个题解,具体实现看代码及注释。代码实现:迭代遍历# Definition for singly-linked li原创 2021-04-28 19:35:08 · 64 阅读 · 0 评论 -
2. 两数相加
2. 两数相加给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。解题思路:这道题其实是个数学题,需要构造一个新的链表用于返回结果,数学加法操作就要考虑进位的问题,考虑进位运算,对每次遍历的两个链表的节点的数字进行相加,再看是否需要进位,每次对加和后的数字对10求商和余数,商用于进位,余数用于构造返回的结果链表使用,结原创 2021-04-22 21:24:16 · 74 阅读 · 0 评论 -
148. 排序链表
148. 排序链表原始题目链接:https://leetcode-cn.com/problems/sort-list/给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。进阶:你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?解题思路:这道题使用递归比较好解题,不过进阶的要求是时间复杂度是O(nlogn)和空间复杂度是O(1),递归是不满足的,因为递归会有额外的栈空间不满足空间复杂的要求,递归是从上至下进行操作,为了满足进阶的要求,需要原创 2021-04-20 15:34:40 · 79 阅读 · 0 评论 -
147. 对链表进行插入排序
147. 对链表进行插入排序原始题目链接:https://leetcode-cn.com/problems/insertion-sort-list/解题思路:类似于数组或者列表的插入排序,但题目操作的是单链表,单链表的插入排序,要知道这几个信息:操作的元素、插入的位置、插入位置的前驱节点;其次需要注意的是插入节点的时候,操作多个节点的指针指向的顺序,在代码的注释中有说明,做链表的题目最好是画图,画图就很好解题了,具体看代码及注释。代码实现:# Definition for singly-l原创 2021-04-14 23:19:05 · 66 阅读 · 0 评论 -
234. 回文链表
234. 回文链表原始题目链接:https://leetcode-cn.com/problems/palindrome-linked-list/解题思路:这道题如果使用额外的空间是比较容易解题的,把链表的值都存放到一个数组里,遍历数组的元素看是否满足条件,这个时候空间复杂度是O(n),所以不是最优解。如果想使用O(1)的空间复杂度,就要使用指针进行原地操作。具体分为5个步骤:查找链表的中间节点,将链表分为两部分反转链表的后半部分遍历前后两部分链表的值是否一样,一样就是回文链表返回True,原创 2021-04-13 22:32:41 · 108 阅读 · 1 评论 -
142. 环形链表 II
142. 环形链表 II原始题目链接:https://leetcode-cn.com/problems/linked-list-cycle-ii/给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。解题思路:这道题需要数学推导等价关系式,如果有环,则推导的最终结论是:链表的头结点到入环点的距离 = 从环内相遇点到入环点的距离 + (n -1) * 环的周长。所以设置两个指针,一个快的一慢的,初始位置都在头结点,一个走两步,一个走一步,如果存在环,则第一次在环内相遇后,原创 2021-04-12 22:41:32 · 63 阅读 · 0 评论 -
143. 重排链表
143. 重排链表原始题目链接:https://leetcode-cn.com/problems/reorder-list/解题思路:观察最后重排链表发现,就是将链表的左半部分和翻转后的有半部分进行了合并后的结果。所以根据这个结果,可以先找到原始链表的中间节点,将链表一分为二,然后将右边部分的链表翻转,再合并两个链表,具体来说,合并是交叉合并的顺序,所以最终的解法可以分为3个步骤,具体实现开代码及注释。找原始链表的中间节点;将右边部分的链表翻转;交叉合并两个链表。代码实现:# De原创 2021-04-12 16:28:21 · 110 阅读 · 0 评论 -
141. 环形链表
141. 环形链表原始题目链接:https://leetcode-cn.com/problems/linked-list-cycle/给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,原创 2021-04-11 16:11:05 · 60 阅读 · 0 评论 -
86. 分隔链表
86. 分隔链表原始题目链接:https://leetcode-cn.com/problems/partition-list/给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你应当 保留 两个分区中每个节点的初始相对位置。解题思路:以x大小为界,将原始链表分为大小两个链表,然后再拼接一起即可,具体实现看代码及注释。代码实现:# Definition for singly-linked list.#原创 2021-04-11 15:32:26 · 100 阅读 · 0 评论 -
83. 删除排序链表中的重复元素
83. 删除排序链表中的重复元素原始题目链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。返回同样按升序排列的结果链表。解题思路:这道题是82题的简单版本,同样先链表判空,再看当前节点和当前节点的下一个节点的值是否相同,这次不用记录这个值,因为要保留一个值,遇到相同的直接修改next指针即可,具原创 2021-04-11 14:58:49 · 88 阅读 · 0 评论 -
82. 删除排序链表中的重复元素 II
82. 删除排序链表中的重复元素 II原始题目链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。返回同样按升序排列的结果链表。!](https://img-blog.csdnimg.cn/20210411142933214.png?x-oss-process=im原创 2021-04-11 14:38:44 · 66 阅读 · 0 评论 -
21. 合并两个有序链表
21. 合并两个有序链表原始题目链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。解题思路:有递归和迭代两种解法,递归的解法个人感觉不如二叉树的递归好理解,反而使用迭代法解决链表的问题更好理解。递归解法一定不要忘记三要素,递归函数定义,递归结束条件,递归等价关系式。递归法有一个地方就是返回值那里要注意,判断 l1 和 l2 头结点哪个原创 2021-04-10 22:57:26 · 68 阅读 · 0 评论 -
92. 反转链表 II
92. 反转链表 II原始题目链接:https://leetcode-cn.com/problems/reverse-linked-list-ii/给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。解题思路:反转单链表,单链表只有指向后继节点的next指针,所以反转的时候需要知道要反转的节点和其前驱节点。这道题是反转指定部分的节点,所以需要四个指针,分别是原创 2021-04-09 18:38:46 · 61 阅读 · 0 评论 -
206. 反转链表
206. 反转链表原始题目链接:https://leetcode-cn.com/problems/reverse-linked-list/解题思路:这道题可以使用迭代和递归两种解法,迭代解法比较好理解,申请两个指针,一前一后,初始化为空和头结点,后面的指针是前面指针的相邻后继节点,每次遍历后面的节点直到为空,翻转的时候将后面指针指向的节点的next指向前面指针指向的节点即可。递归解法,不太好理解,递归的终止条件是当前节点或者当前节点的下一个节点是空节点,在递归函数内部改变指针的方向,使用的语句是c原创 2021-04-09 15:15:46 · 49 阅读 · 0 评论 -
23. 合并K个升序链表
23. 合并K个升序链表原始题目链接:https://leetcode-cn.com/problems/merge-k-sorted-lists/给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例 1:输入:lists = [[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下: [1->4->5,1->3->4,2->6 ]将它们合并到一个有序链表中得原创 2021-02-19 14:31:20 · 94 阅读 · 1 评论