链表
追光者2020
没有实力的愤怒毫无意义。
展开
-
leetcode 148. 排序链表 (归并排序的迭代写法)
题目描述给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。进阶:你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?示例 1:输入:head = [4,2,1,3]输出:[1,2,3,4]示例 2:输入:head = [-1,5,3,4,0]输出:[-1,0,3,4,5]示例 3:输入:head = []输出:[]归并排序的简要步骤:将数组划分为只有一个元素的子数组,然后依次向上合并,直到合并到数组长度等于原始数组长度。类似于下图原创 2021-08-19 16:31:27 · 145 阅读 · 0 评论 -
leetcode 445. 两数相加 II(翻转链表的使用)
题目描述给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。示例1:输入:l1 = [7,2,4,3], l2 = [5,6,4]输出:[7,8,0,7]示例2:输入:l1 = [2,4,3], l2 = [5,6,4]输出:[8,0,7]示例3:输入:l1 = [0], l2 = [0]输出:[0]首先翻转两个链表,然后按照整数相加的规则从最低位开始遍原创 2021-08-19 11:44:24 · 105 阅读 · 0 评论 -
leetcode19. 删除链表的倒数第 N 个结点(快慢指针)
题目描述给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。进阶:你能尝试使用一趟扫描实现吗?示例 1:输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]示例 2:输入:head = [1], n = 1输出:[]示例 3:输入:head = [1,2], n = 1输出:[1]在本题目中有可能出现删除头结点的情况,因此需要设置虚拟头结点,设置快慢指针,快指针先走 n 步,然后慢指针再向后移动,由于慢指针是从虚拟头结点,因此快指针结束的时候慢原创 2021-08-16 15:34:59 · 56 阅读 · 0 评论 -
leetcode 234. 回文链表
题目描述请判断一个链表是否为回文链表。示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true**进阶:**你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?一种方法是遍历链表,将链表中的所有值存入到数组中,然后再使用双指针判断数组中的元素。另外一种做法是模仿数组的做法,将链表的后半段翻转,然后两个指针一个从前遍历一个从后遍历确定链表的长度n,需要翻转的部分是后半部分half = n/2长度,翻转的次数是原创 2021-08-15 15:36:20 · 57 阅读 · 0 评论 -
leetcode 25. K 个一组翻转链表(递归)
题目描述给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。进阶:你可以设计一个只使用常数额外空间的算法来解决此问题吗?你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。示例 1:输入:head = [1,2,3,4,5], k = 2输出:[2,1,4,3,5]示例 2:输入:head = [1,2,3,4,5], k = 3输出:[3,2,1,4原创 2021-07-20 09:21:13 · 96 阅读 · 0 评论 -
LeetCode 203 移除链表元素
题目描述给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。示例 1:输入:head = [1,2,6,3,4,5,6], val = 6输出:[1,2,3,4,5]示例 2:输入:head = [], val = 1输出:[]示例 3:输入:head = [7,7,7,7], val = 7输出:[]递归解法:确定递归出口:当节点为空时,退出;每一次如果该节点的值等于val ,那么需要head原创 2021-06-05 08:47:27 · 80 阅读 · 0 评论 -
环形链表系列
题目描述给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。进阶:你能用 O(1)(即,常量)内存解决此问题吗?示例 1:输入:head = [3,2,0,-4]原创 2021-06-04 15:31:32 · 62 阅读 · 0 评论 -
LeetCode 61 循环链表
题目描述给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。示例 1:输入:head = [1,2,3,4,5], k = 2输出:[4,5,1,2,3]做过旋转数组的那个题之后,这样的旋转方式需要翻转三次,想想就复杂。下面说一种较为简单的方法,旋转之后链表的头节点以及尾节点发生了变化。因此需要找到旋转之后的头节点和尾节点即可。题目要求是将后边的k个节点移动到前面,因此新的尾节点就是在len-k-1 处,新的头节点在len-k处,旧的尾节点在计算链表长度时得出,千万原创 2021-06-04 11:42:25 · 103 阅读 · 0 评论 -
LeetCode 23 合并K个有序链表(链表,队列)
给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例 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]将它们合并到一个有序链表中得到。1->1->2->3->4->4->5->6示例 2:输入:lists = []输出:[]示例 3原创 2021-06-04 10:44:59 · 511 阅读 · 0 评论 -
LeetCode 2 两数相加(链表)
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807.题解:两种解题思路,区别在于创建链表节点那块儿,第一种方法没有直接创建,而是在求和的过程中创建,如果头结点为空的话先赋值,如果不空的话,就在创建当前节点的原创 2021-06-04 09:38:19 · 134 阅读 · 0 评论 -
day29:48. 复杂链表的复刻
问题描述:请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof本题目不能直接返回原链表,特别巧妙的思路,体会链表next的作用。第一步,将原链表中的节点均复制一份,并且源节点指向复制的节点,复制的节点指原创 2020-06-24 10:43:01 · 105 阅读 · 0 评论 -
leetcode 92. 反转链表 II
题目描述给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。示例 1:输入:head = [1,2,3,4,5], left = 2, right = 4输出:[1,4,3,2,5]示例 2:输入:head = [5], left = 1, right = 1输出:[5]题解:该题目涵盖了链表翻转这一题目,翻转该区间就需要找到区间left前一个节点a(原创 2021-05-23 11:43:13 · 250 阅读 · 0 评论 -
leetcode 82. 删除排序链表中的重复元素 II
题目描述存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。返回同样按升序排列的结果链表。示例 1:输入:head = [1,2,3,3,4,4,5]输出:[1,2,5]示例 2:输入:head = [1,1,1,2,3]输出:[2,3]链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii本题目要求删除原创 2021-05-23 10:52:08 · 233 阅读 · 0 评论 -
LeetCode 328. 奇偶链表
题目描述给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。示例 1:输入: 1->2->3->4->5->NULL输出: 1->3->5->2->4->NULL示例 2:输入: 2->1->3->5->6-&g原创 2021-05-23 10:12:30 · 90 阅读 · 0 评论 -
leecode 143. 重排链表
题目描述给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例 1:给定链表 1->2->3->4, 重新排列为 1->4->2->3.示例 2:->2->3->4->5, 重新排列为 1->5->2->4->3.题解:理解本题目之前首先要看反转链表 这个题目,将一个链表反转。原创 2021-05-03 11:47:43 · 162 阅读 · 0 评论 -
剑指 Offer 24. 反转链表
题目描述定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL题解:定义两个指针分别为pre和cur,两个指针一次向下遍历,初始pre指向为nullptr,因为翻转后头结点会变成尾节点,链表结束是以nullptr结束的,因此pre为nullptr,cur指向head,反转链表后cur的下一个位置便是pre,由于在赋值时会把原创 2021-05-03 10:42:24 · 109 阅读 · 0 评论