摘要: 解题思路 将链表分为三部分:[0, m)、[m, n]、(n, L],其中 L 为链表长度。 第一步:使用虚拟头节点 dummy,用于将 head 也能参与操作; 第二步:找到第 m-1 节点(firstHalfEnd),用于连接反转后的第二部分链表; 第三步:遍历[m, n],进行链表反转。注意在 阅读全文
posted @ 2020-11-20 23:44 大杂草 阅读(189) 评论(0) 推荐(0) 编辑
摘要: 解题思路 三指针,一个指向前半部分待插入位置,一个指向后半部分待插入位置,最后一个从前往后遍历 代码 /** * Definition for singly-linked list. * public class ListNode { * public int val; * public ListN 阅读全文
posted @ 2020-11-20 22:59 大杂草 阅读(163) 评论(0) 推荐(0) 编辑
摘要: 解题思路 双指针:第一个指针先走 n 步,然后两个指针同时走。 这里要注意当链表长度<=n,要删除头节点。 代码 /** * Definition for singly-linked list. * public class ListNode { * public int val; * public 阅读全文
posted @ 2020-11-20 22:37 大杂草 阅读(203) 评论(0) 推荐(0) 编辑
摘要: 解题思路 使用快慢指针。这里要注意的是,while 的条件会影响当中间节点有两个时,slow 指向的是第一个,还是第二个节点。 // 返回的是第一个 while(fast.next != null && fast.next.next != null) // 返回的是第二个 while(fast != 阅读全文
posted @ 2020-11-20 22:25 大杂草 阅读(202) 评论(0) 推荐(0) 编辑
摘要: 解题思路 找到后半部分链表,再反转。然后与前半部分链表比较 代码 /** * Definition for singly-linked list. * public class ListNode { * public int val; * public ListNode next; * public 阅读全文
posted @ 2020-11-20 22:18 大杂草 阅读(196) 评论(0) 推荐(0) 编辑
摘要: 方法一:双指针 解题思路 假设链表存在相交时,headA 的长度为 a + c,headB 的长度为 b + c。如果把 headA 连上 headB,headB 连上 headB 的话,当遍历这两个新链表时有: \[ (a + c) + (b + c) = (b + c) + (a + c) \] 阅读全文
posted @ 2020-11-20 16:57 大杂草 阅读(202) 评论(0) 推荐(0) 编辑
摘要: 解题思路 本题是在141. 环形链表基础上的拓展,如果存在环,要找出环的入口。 如何判断是否存在环,我们知道通过快慢指针,如果相遇就表示有环。那么如何找到入口呢? 如下图所示的链表: 当 fast 与 slow 第一次相遇时,有以下关系: fast = 2 * slow slow = a + n*b 阅读全文
posted @ 2020-11-20 16:24 大杂草 阅读(181) 评论(0) 推荐(0) 编辑
摘要: 题目描述 给定一个链表,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行 阅读全文
posted @ 2020-11-20 15:47 大杂草 阅读(192) 评论(0) 推荐(0) 编辑
摘要: 题目描述 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 示例: 给定的有序链表: [-10, -3, 0, 5, 9], 一个可能的答案是:[0, -3, 9, -10, null 阅读全文
posted @ 2020-11-20 15:17 大杂草 阅读(239) 评论(0) 推荐(0) 编辑