
链表
圆滚滚的柴柴
这个作者很懒,什么都没留下…
展开
-
NC33 合并两个排序的链表
题目:NC33 合并两个排序的链表思路:递归思路:递归函数返回的是合并后的链表;若两个节点有空,则返回另一个节点;递归函数要做的是,比较当前两个节点的值,较小的节点的下一个继续参与递归,返回这个较小的节点。代码:/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Sol原创 2021-08-19 20:36:00 · 511 阅读 · 0 评论 -
牛客 剑指offer:环形链表的约瑟夫问题
题目:环形链表的约瑟夫问题思路:代码:import java.util.*;public class Solution { /** * * @param n int整型 * @param m int整型 * @return int整型 */ public int ysf (int n, int m) { // write code here if (n < 1 || m < 1)原创 2021-05-07 16:13:33 · 174 阅读 · 0 评论 -
leetcode Java:61. 旋转链表
题目:61. 旋转链表思路:找到链表长度;链表首尾连成环;根据k断开链表。代码:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode n原创 2021-03-29 15:54:16 · 87 阅读 · 0 评论 -
牛客 剑指offer:两个链表的第一个公共节点
题目:两个链表的第一个公共节点思路:双指针。链表a、b的长度之和是一定的,两个指针分别指向两个链表头,同时后移,若移到链表尾就指向另一链表的表头。这样,二者必会相等。注意若没有相交,则二者同时到达对方链表尾部为空。代码:/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solu原创 2021-03-23 16:03:29 · 85 阅读 · 0 评论 -
牛客 剑指offer:反转链表
题目:反转链表思路:递归。递归函数返回的是 已经反转好的链表。代码:/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode ReverseList(ListNode head) { if (head ==原创 2021-03-09 15:25:49 · 104 阅读 · 0 评论 -
牛客 剑指offer:合并k个排序链表
题目:合并k个排序链表思路:优先队列。优先队列允许我们对自定义数据类型排序。声明优先队列时,传入Comparator。代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * }原创 2021-03-09 15:10:50 · 89 阅读 · 0 评论 -
牛客 剑指offer:链表中环的入口节点
题目:链表中环的入口节点思路:不考虑空间,可以用一个集合来做。考虑空间:若有环,快慢指针必定会相遇。如下图:A是链表起始节点,B是环的入口,C是快慢指针相交的位置。相遇时:快指针走过:a + b + c + b;慢指针走过:a + b。由于快指针每次移动2步,因此,相遇时,快指针走的路程是慢指针的2倍。所以,有:a + b + c + b = 2 * (a + b),即a = c。相遇后,把slow指向head,slow和fast同步移动,再次相遇就是入口节点。代码:/** * De原创 2021-03-08 16:17:11 · 116 阅读 · 0 评论 -
leetcode Java:160. 相交链表
题目:160. 相交链表思路:双指针。对于两条链表a,b,a+b的节点数等于b+a的节点数。所以,我们用两个指针分别指向两个链表,遍历他们。如果a指针到了a链表最后一个节点,那么把a指针指向b链表;对b链表和b指针也是如此。如果两个链表有交点,那么上述遍历方式两个指针会同时到达起始交点;如果两个链表没有交点,那么当两个指针会同时到达对方的末节点。代码:/** * Definition for singly-linked list. * public class ListNode {原创 2021-03-06 14:38:15 · 102 阅读 · 0 评论 -
牛客 剑指offer:合并有序链表
题目:合并有序链表思路:递归 , 迭代。迭代的思路比较简单,新建一个节点,把两条链表串起来即可。递归:递归函数返回的是:排序好的节点递归函数要做的是:把节点链起来。代码:import java.util.*;/* * public class ListNode { * int val; * ListNode next = null; * } */public class Solution { /** * * @param l1 ListN原创 2021-03-05 14:54:16 · 80 阅读 · 0 评论 -
牛客 剑指offer:判断链表是否有环
题目:判断链表是否有环思路:双指针。快指针每次走2步,慢指针每次走一步。如果有环,二者必定相遇;如果没环,快指针必定率先到达链表尾部。代码:/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } *原创 2021-03-03 14:43:29 · 132 阅读 · 1 评论 -
牛客 剑指offer:k个一组翻转链表
题目:k个一组翻转链表思路:递归递归函数返回已经反转好的链表;递归函数需要把本次翻转好的链表 链到 下一次翻转好的链表上。代码:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNod原创 2021-03-02 17:50:17 · 132 阅读 · 0 评论 -
leetcode Java二刷:25. K 个一组翻转链表
题目:25. K 个一组翻转链表思路:首先,我们根据k把链表分成,待翻转的链表,待翻转的前驱,待翻转的后继;对需要翻转的部分翻转,然后更新指针,继续上一步,直到全部翻转完成。翻转一组链表:递归实现。递归函数返回的是已经翻转完成的链表;递归函数要做的是把当前的节点head,连接到已经翻转完成的链表尾部;翻转完成后head刚好指向翻转后的尾部节点。递归函数的返回条件是,节点为空或者节点的下一个为空。代码:/** * Definition for singly-linked list.原创 2021-01-13 19:17:12 · 94 阅读 · 0 评论 -
leetcode Java二刷:24. 两两交换链表中的节点
题目:24. 两两交换链表中的节点思路:递归 和 非递归。递归:递归函数返回的是已经交换过的节点;递归函数内部需要实现两个节点的交换非递归:遍历链表实现交换即可。代码,递归:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.原创 2021-01-13 19:07:04 · 137 阅读 · 0 评论 -
leetcode Java二刷:23. 合并K个升序链表
题目:23. 合并K个升序链表思路:优先队列。 我们把所有的节点放到优先队列里,重写Comparator方法,按照节点的值排序,这样队列里的节点都是有序的,然后我们按照顺序串起来所有节点即可。代码:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val)原创 2021-01-13 18:58:13 · 139 阅读 · 0 评论 -
leetcode Java二刷:21. 合并两个有序链表
题目:21. 合并两个有序链表思路:建立一个伪节点,把两个链表按照大小串起来。代码:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode nex原创 2021-01-13 17:38:56 · 67 阅读 · 0 评论 -
leetcode Java二刷:19. 删除链表的倒数第N个节点
题目:19. 删除链表的倒数第N个节点思路: 首先,可以先遍历一遍得到链表长度,再寻找待删除的节点。一遍循环的实现方法: 两个指针first和second,first先于seconnd指针n步,即first指针先后移n步,然后二者再同步后移,这样first指针到达链表末尾时,second指针恰好来到需要删除的节点。 同时,为了便于删除操作,我们最好找到需要删除节点的前驱节点,所以可以建立一个伪节点指向head节点,把second初始化为该伪节点,这样按照上述方法移动完成后就可以得到待删除节点原创 2021-01-11 19:21:49 · 211 阅读 · 0 评论 -
leetcode Java二刷:2. 两数相加
题目:2. 两数相加思路:模拟加法即可。代码:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val;原创 2020-12-22 10:43:44 · 79 阅读 · 0 评论