【力扣142】环形链表
题目给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。 不允许修改 链表。 示例 1: 123输入:head = [3,2,0,-4], pos = 1输出:返回索引为 1 的链表节点解释:链表中有一个环,其尾部连接到第二个节点。 示例 2: 123输入:head = [1,2], pos = 0输出:返回索引为 0 的链表节点解释:链表中有一个环,其尾部连接到第一个节点。 示例 3: 123输入:head = [1], pos = -1输出:返回 null解释:链表中没有环。 提示: 链表中节点的数目范围在范围 [0, 104] 内 -105 <= Node.val <= 105 pos 的值为 -1 或者...
【力扣160】相交链表
题目给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意,函数返回结果后,链表必须 保持其原始结构 。 自定义评测: 评测系统 的输入如下(你设计的程序 不适用 此输入): intersectVal - 相交的起始节点的值。如果不存在相交节点,这一值为 0 listA - 第一个链表 listB - 第二个链表 skipA - 在 listA 中(从头节点开始)跳到交叉节点的节点数 skipB - 在 listB 中(从头节点开始)跳到交叉节点的节点数 评测系统将根据这些输入创建链式数据结构,并将两个头节点 headA 和 headB 传递给你的程序。如果程序能够正确返回相交节点,那么你的解决方案将被 视作正确答案 。 示例 1: 123456输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skip...
【力扣27】移除元素
题目给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作: 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums的其余元素和 nums 的大小并不重要。 返回 k。 示例 1: 1234输入:nums = [3,2,2,3], val = 3输出:2, nums = [2,2,_,_]解释:你的函数函数应该返回 k = 2, 并且 nums 中的前两个元素均为 2。你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。 示例 2: 12345输入:nums = [0,1,2,2,3,0,4,2], val = 2输出:5, nums = [0,1,4,0,3,_,_,_]解释:你的函数应该返回 k = 5,并且 nums 中的前五个元素为 0,0,1,3,4。注意这五个元素可以任意顺序返回。你在返回的 k 个元素之外留下了什么并...
【力扣283】移动零
题目给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 12输入: nums = [0,1,0,3,12]输出: [1,3,12,0,0] 示例 2: 12输入: nums = [0]输出: [0] 提示: 1 <= nums.length <= 104 -231 <= nums[i] <= 231 - 1 实现代码 双指针实现,定义p1、p2,都指向第一个元素,如果p1值为0,则p2向前移动找出不为0的值和p1进行交换,直到p2 = nums.length; p2的作用就是为p1找出不为0的值进行替换; 12345678910111213141516171819class Solution { public void moveZeroes(int[] nums) { int p1 = 0, p2 = 0; while (p2 < nums.length) { if (nums...
【力扣876】链表的中间节点
题目给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 示例 1: 123输入:head = [1,2,3,4,5]输出:[3,4,5]解释:链表只有一个中间结点,值为 3 。 示例 2: 123输入:head = [1,2,3,4,5,6]输出:[4,5,6]解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。 提示: 链表的结点数范围是 [1, 100] 1 <= Node.val <= 100 实现代码 使用快慢双指针方式,假设指针p1,p2,初始都指向头节点,同时往下走,p1每次走一步,p2每次走两步,那么当p2走到链表最后一个节点或空节点的时候,p1就在链表的中间,如图: 123456789101112131415161718192021222324/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ...
【力扣21】删除链表的倒数第N个节点
题目给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 12输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5] 示例 2: 12输入:head = [1], n = 1输出:[] 示例 3: 12输入:head = [1,2], n = 1输出:[1] 提示: 链表中结点的数目为 sz 1 <= sz <= 30 0 <= Node.val <= 100 1 <= n <= sz 实现代码 使用双指针方式,定义指针p1、p2,都指向链表头节点,起始p1移动k步,那么p2移动n-k步的位置就是倒数第k的位置; 题目需要的是删除倒数第k位置的节点,那么,我们只需要找出k节点的前一个节点即可(或者说是找出倒数k+1位置的节点),即n-(k+1)的位置,如图; 12345678910111213141516171819202122232425262728293031/** * Definition for singly-linked list. * public class Li...
【力扣23】合并k个升序链表
题目给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 示例 1: 12345678910输入: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: 12输入:lists = []输出:[] 示例 3: 12输入:lists = [[]]输出:[] 提示: k == lists.length 0 <= k <= 10^4 0 <= lists[i].length <= 500 -10^4 <= lists[i][j] <= 10^4 lists[i] 按 升序 排列 lists[i].length 的总和不超过 10^4 实现代码方式一 基于优先级队列的特性,先将所有链表添加到优先级队列中,那么就会给每个...
优先级队列
题目实现一个优先级队列(二叉堆) 实现代码 通过完全二叉树来实现,并且底层使用数组来构建完全二叉树的逻辑结构 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104public class PriorityQueueDemo { static class PriorityQueue { private final int[] arr; private int size; public PriorityQueue(int capacity) { // 从1开始 arr = new int[capacity + 1]; size = 0; }...
【力扣21】合并两个有序链表
题目将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 12输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4] 示例 2: 12输入:l1 = [], l2 = []输出:[] 示例 3: 12输入:l1 = [], l2 = [0]输出:[0] 提示: 两个链表的节点数目范围是 [0, 50] -100 <= Node.val <= 100 l1 和 l2 均按 非递减顺序 排列 实现代码 使用双指针方式,维护两个链表,相互逐步对比大小,小节点放入新链表,并移动到下一个节点,最后判断哪个子链表还有剩,全部连接到新链表后面,最终得到一个排好序的链表; 123456789101112131415161718192021222324252627282930313233343536/** * Definition for singly-linked list. * public class ListNode { * int val; * ...
【力扣86】分割链表
题目给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1: 12输入:head = [1,4,3,2,5,2], x = 3输出:[1,2,2,4,3,5] 示例 2: 12输入:head = [2,1], x = 2输出:[1,2] 提示: 链表中节点的数目在范围 [0, 200] 内 -100 <= Node.val <= 100 -200 <= x <= 200 实现代码 使用双指针方式,维护两个链表,小于x的一个链表,大于等于x的放一个链表,最后再进行合并 1234567891011121314151617181920212223242526272829303132333435/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ...














