面试经典-分割链表
分割链表题目86. 分隔链表 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1: 输入:head = [1,4,3,2,5,2], x = 3输出:[1,2,2,4,3,5] 示例 2: 输入:head = [2,1], x = 2输出:[1,2] 提示: 链表中节点的数目在范围 [0, 200] 内 -100 <= Node.val <= 100 -200 <= x <= 200 题解题解一(两次循环法)1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556public class LinkedListPartition { public static void main(String[] args) {// ...
面试经典-旋转链表
旋转链表题目61. 旋转链表 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。 示例 1: 输入:head = [1,2,3,4,5], k = 2输出:[4,5,1,2,3] 示例 2: 输入:head = [0,1,2], k = 4输出:[2,0,1] 提示: 链表中节点的数目在范围 [0, 500] 内 -100 <= Node.val <= 100 0 <= k <= 2 * 109 题解 此题有点难,适合二刷 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586public class RotateRight { public static void main(String[] args) { ...
面试经典-删除排序链表中的重复元素II
删除排序链表中的重复元素II题目82. 删除排序链表中的重复元素 II 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。 示例 1: 输入:head = [1,2,3,3,4,4,5]输出:[1,2,5] 示例 2: 输入:head = [1,1,1,2,3]输出:[2,3] 提示: 链表中节点数目在范围 [0, 300] 内 -100 <= Node.val <= 100 题目数据保证链表已经按升序 排列 题解 此题有点难,适合二刷 12345678910111213141516171819202122232425262728293031public class DeleteDuplicates { public static void main(String[] args) { ListNode node1 = new ListNode(1); node1.next = new ListNode(1); no...
面试经典-删除链表的倒数第N个节点
删除链表的倒数第N个节点题目19. 删除链表的倒数第 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] 提示: 链表中结点的数目为 sz 1 <= sz <= 30 0 <= Node.val <= 100 1 <= n <= sz 进阶:你能尝试使用一趟扫描实现吗? 题解 此题有点难,适合二刷 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263import java.util.ArrayList;import java.util.List;public class RemoveNthF...
面试经典-反转链表II
反转链表II题目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] 提示: 链表中节点数目为 n 1 <= n <= 500 -500 <= Node.val <= 500 1 <= left <= right <= n 进阶: 你可以使用一趟扫描完成反转吗? 题解题解一 转换为数组再进行处理 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152public class ReverseBetween ...
面试经典-随机链表的复制
随机链表的复制题目138. 随机链表的复制 完全读不懂题,但能看懂案例🤣🤣🤣 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。 例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 x.random --> y 。 返回复制链表的头节点。 用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示: val:一个表示 Node.val 的整数。 random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为 null ...
面试经典-合并两个有序链表
合并两个有序链表题目21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4] 示例 2: 输入:l1 = [], l2 = []输出:[] 示例 3: 输入:l1 = [], l2 = [0]输出:[0] 提示: 两个链表的节点数目范围是 [0, 50] -100 <= Node.val <= 100 l1 和 l2 均按 非递减顺序 排列 题解 简单,自己做 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071public class MergeTwoLists { public static void main(String[] args) ...
面试经典-两数相加
两数相加题目2. 两数相加 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。 示例 1: 输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807. 示例 2: 输入:l1 = [0], l2 = [0]输出:[0] 示例 3: 输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]输出:[8,9,9,9,0,0,0,1] 提示: 每个链表中的节点数在范围 [1, 100] 内 0 <= Node.val <= 9 题目数据保证列表表示的数字不含前导零 题解 简单,注意点:超过10向前进一 12345678910111213141516171819202122232425262728293031323334353...
面试经典-环形链表
环形链表题目141. 环形链表 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。 如果链表中存在环 ,则返回 true 。 否则,返回 false 。 示例 1: 输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一个环,其尾部连接到第二个节点。 示例 2: 输入:head = [1,2], pos = 0输出:true解释:链表中有一个环,其尾部连接到第一个节点。 示例 3: 输入:head = [1], pos = -1输出:false解释:链表中没有环。 提示: 链表中节点的数目范围是 [0, 104] -105 <= Node.val <= 105 pos 为 -1 或者链表中的一个 有...
