Leetcode/剑指offer-【链表篇】
leetcode
魑魅魍魉114
这个作者很懒,什么都没留下…
展开
-
Leetcode160. 相交链表
请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回。给你两个单链表的头节点。原创 2023-09-16 09:16:03 · 420 阅读 · 0 评论 -
Leetcode148. 排序链表
【代码】Leetcode148. 排序链表。原创 2023-09-11 10:38:20 · 258 阅读 · 0 评论 -
Leetcode147. 对链表进行插入排序
下面是插入排序算法的一个图形示例。部分排序的列表(黑色)最初只包含列表中的第一个元素。每次迭代时,从输入数据中删除一个元素(红色),并就地插入已排序的列表中。对链表进行排序,并返回。原创 2023-09-11 10:10:59 · 123 阅读 · 0 评论 -
Leetcode143. 重排链表
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。原创 2023-09-09 19:48:26 · 271 阅读 · 0 评论 -
Leetcode86. 分隔链表
两个分区中每个节点的初始相对位置。,请你对链表进行分隔,使得所有。给你一个链表的头节点。原创 2023-08-28 11:56:07 · 247 阅读 · 0 评论 -
Leetcode61 旋转链表
旋转链表,将链表每个节点向右移动。给你一个链表的头节点。原创 2023-08-18 10:26:22 · 202 阅读 · 0 评论 -
Leetcode24 两两交换链表相邻的节点
【代码】Leetcode24 两两交换链表相邻的节点。原创 2023-08-10 21:07:28 · 138 阅读 · 0 评论 -
Leetcode237 删除链表中的节点(只提供需要被删除的节点)
链表的所有值都是 唯一的,并且保证给定的节点 node 不是链表中的最后一个节点。给你一个需要删除的节点 node。你将 无法访问 第一个节点 head。注意,删除节点并不是指从内存中删除它。有一个单链表的 head,我们想删除它其中的一个节点 node。给定节点的值不应该存在于链表中。node 前面的所有值顺序相同。node 后面的所有值顺序相同。链表中的节点数应该减少 1。原创 2023-02-01 20:22:45 · 59 阅读 · 0 评论 -
JZ52 两个链表的第一个公共结点
输入两个无环的单向链表,找出它们的第一个公共结点,如果没有公共节点则返回空。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)链表1:1-2-3-6-7链表2:4-5-6-7解题思路:使用两个指针N1,N2,一个从链表1的头节点开始遍历,我们记为N1,一个从链表2的头节点开始遍历,我们记为N2。让N1和N2一起遍历,当N1先走完链表1的尽头(为null)的时候,则从链表2的头节点继续遍历,同样,如果N2先走完了链表2的尽头,则从链..原创 2022-05-03 23:50:27 · 88 阅读 · 0 评论 -
JZ24 翻转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。实现代码如下:public class ListNode { int val; ListNode next = nill ListNode(int val) { this.val = val; }} public ListNode ReverseList(ListNode head) { if(head == null || head.next == null){//当链表为原创 2021-02-22 13:13:37 · 133 阅读 · 0 评论 -
Leetcode82. 删除链表中重复的元素
题目描述删除给出链表中的重复元素(链表中元素从小到大有序),使链表中的所有元素都只出现一次 1 2 3 例如: 给出的链表为1->1->2,返回1->2. 给出的链表为1->1->2->3->3,返回1->2->3. 思路分析:首先,链表为空直接返回其次,如果当前结点值与下一结点的值相等最后要注意一下else的位置,比如说结点1和2比较后相等把2消去,这个时候就不能把指针原创 2021-04-15 09:47:13 · 199 阅读 · 0 评论 -
Leetcode142. 链表中环的入口结点
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。输入描述:输入分为2段,第一段是入环前的链表部分,第二段是链表环的部分,后台将这2个会组装成一个有环或者无环单链表返回值描述:返回链表的环的入口结点即可解题思路:方法1:hash法,记录第一次重复的结点通过使用set或者map来存储已经遍历过的结点,当第一次出现重复的结点时,即为入口结点。方法2:快慢指针通过定义slow和fast指针,slow每走一步,fast走两步,若是有环,则一定会在环的某个结点处相遇(s.原创 2022-05-04 10:52:48 · 475 阅读 · 0 评论 -
JZ6 从尾到头打印链表
描述输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)如输入{1,2,3}的链表如下图:返回一个数组为[3,2,1] public ArrayList<Integer> printListFromTailToHead(ListNode head){ if(head == null) return new ArrayList(); Stack<Integer> stack = new Stack<.原创 2022-05-03 22:57:58 · 390 阅读 · 0 评论 -
JZ22 链表中倒数最后k个节点
题目描述输入一个链表,输出该链表中倒数第k个结点。输入1,{1,2,3,4,5}返回值{5}思路:快慢指针首先让快指针先行k-1步,然后让快慢指针每次同行一步,直到快指针指向尾节点,慢指针就是倒数第K个节点。1-2-3-4-5-null,k=2,p1快指针先走一步到节点2,此时 p2慢指针节点为1,然后 p1,p2同时往前走,当再走三步时,此时快指针 p1指向了尾节点,慢指针p2指向了倒数第 k (2)个节点4特别注意:链表长度小于 K 的情况代码如下:原创 2021-02-22 13:28:42 · 101 阅读 · 0 评论 -
JZ18 删除链表中的节点(提供头结点和被删除节点的val)
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。1.此题对比原题有改动2.题目保证链表中节点的值互不相同输入:{2,5,1,9},5返回值:{2,1,9}思路:删除一个链表节点,肯定是断掉它的前一个节点指向它的指针,然后指向它的后一个节点,即越过了需要删除的这个节点。pre.next = cur.next;//断开链接step 1:首先我们加入一个头部节点,方便于如果可能的话删除掉第一个元素。 step 2:准备两个指针遍历链表原创 2022-05-03 17:38:05 · 1374 阅读 · 0 评论 -
JZ25 合并两个排序的链表
描述输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。数据范围:0 \le n \le 10000≤n≤1000,-1000 \le 节点值 \le 1000−1000≤节点值≤1000要求:空间复杂度O(1)O(1),时间复杂度O(n)O(n)public ListNode Merge(ListNode head1,ListNode head2){ ListNode dummy = new ListNode(0); List...原创 2022-05-04 00:13:45 · 335 阅读 · 0 评论 -
Leetcode83 删除给出链表中的重复元素
删除给出链表中的重复元素(链表中元素从小到大有序),使链表中的所有元素都只出现一次,思路分析:首先,链表为空直接返回其次,如果当前结点值与下一结点的值相等最后要注意一下else的位置,比如说结点1和2比较后相等把2消去,这个时候就不能把指针指向下一结点了,要继续比较1和3,所以消去结点和指向下一结点只能二选一public ListNode deleteDuplicates (ListNode head) { if(head == null) return hea.原创 2022-05-10 18:59:15 · 420 阅读 · 0 评论 -
Leetcode141 判断链表中是否有环
判断给定的链表中是否有环。如果有环则返回true,否则返回false。快慢指针的思想 public boolean hasCycle(ListNode head) { //快慢指针 ListNode slow = head; ListNode fast = head; while(fast != null && fast.next != null){ fast = fast.next.ne.原创 2022-05-10 18:30:38 · 90 阅读 · 0 评论 -
Leetcode23 合并K个升序链表
等级:困难给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。输入:lists = [[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]思路分析:1、将k个链表配对并将同一对中的链表进行合并(采用顺序合并的方法)2、第一轮合并后,k个链表合并成了 k/2 个链表,平均长度 2n/k ,然后是 k/4、k/8...等等3、重复这一过程,知道获取最终的有序链表图解代码实现:pub原创 2022-05-10 18:22:18 · 200 阅读 · 0 评论 -
Leetcode25 链表中的节点每k个一组翻转
给你链表的头节点 head ,每k个节点一组进行翻转,请你返回修改后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。输入:head = [1,2,3,4,5], k = 2输出:[2,1,4,3,5]思路分析:链表分区为已翻转部分+待翻转部分+未翻转部分每次翻转前,要确定翻转链表的范围,这个必须通过 k 此循环来确定需记录翻转链表前驱和后继...原创 2022-05-10 17:24:59 · 171 阅读 · 0 评论 -
Leetcode92 翻转 m 到 n 之间的链表
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。说明:1 ≤m≤n≤ 链表长度。示例:输入: 1->2->3->4->5->NULL, m = 2, n = 4输出: 1->4->3->2->5->NULL链接:https://leetcode-cn.com/problems/reverse-linked-list-ii我们可以看出来,总共需要n-m步即可,第一步是将结点3放到结点1的后面,第二步将结点4放到结点...原创 2021-04-20 09:42:32 · 363 阅读 · 0 评论 -
Leetcode19 删除链表中倒数第n个节点
思路分析:定义快慢指针,快指针先走n步,然后快慢指针一起走,快指针走到空的时候慢指针正好在倒数第n个结点上。区别的地方只是在于要删除某个结点的话,我们需要知道它的前一个结点是什么。如果要删除的结点是链表头结点的话(这个时候没有前一个结点)。这种情况下我们进行一下判断public ListNode removeNthFromEnd(ListNode head, int n){ if(head == null){ return null; } ListNo原创 2021-04-15 09:34:18 · 289 阅读 · 0 评论