LeeCode链表问题(二)
LeeCode 19: 删除链表的倒数第n个节点
题目描述:
给你一个链表,删除链表的倒数第
n个节点,并返回链表的头节点。
标签:链表,双指针
时间复杂度:O(N)
建立模型:
- 定义虚拟头节点,使其 next 指向 head
- 定义快慢指针 fast,slow,slow指向虚拟头节点,fast指向第 n 个节点
- 同时移动 fast,slow,直至 fast 到达链表尾部
- 此时 slow 的 next 域指向的节点即是要删除的节点
- 删除 slow.next,并返回虚拟头节点的 next 域
定义虚拟头节点的目的是便于将头节点与其它节点一样处理,无需额外讨论。
代码实现:
# Python3 实现
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
virtualHead = ListNode(0, head)
slow, fast = virtualHead, virtualHead
for _ in range(n):
fast = fast.next
while fast.next:
slow, fast = slow,next, fast.next
slow.next = slow.next.next
return virtualHead.next
// Java 实现
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode virtualHead = new ListNode(0, head);
ListNode fast = virtualHead;
ListNode slow = virtualHead;
while (n > 0) {
fast = fast.next;
n -= 1;
}
while (fast.next != null) {
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return virtualHead.next;
}
LeeCode 02.07: 链表相交
题目描述:
给你两个单链表的头节点
headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,则返回null。
标签:链表,双指针
时间复杂度:O(M+N)
建立模型:
- 假设链表 headA 长度为a,链表 headB 长度为b,链表相交长度为c
- 遍历完 headA 再遍历 headB,到起始公共节点,共经过 a + (b - c + 1) 个节点
- 遍历完 headB 再遍历 headA,到起始公共节点,共经过 b + (a - c + 1) 个节点
- 若 c = 0,即不存在公共节点,则当前节点 a,b 均指向
Null - 若 c > 0,即存在公共节点,则当前节点 a,b 指向起始公共节点
代码实现:
# Python3 实现
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
a, b = headA, headB
# a == b 存在两种情况
# 1. a = null, b = null, 即两指针均将 headA 和 headB 遍历完也没有相遇
# 2. a = c1, b = c1, 即两指针遍历过程中在链表相交起始节点相遇
while a != b:
a = a.next if a else headB
b = b.next if b else headA
return a
// Java 实现
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode a = headA;
ListNode b = headB;
while (a != b) {
a = (a == null ? headB : a.next);
b = (b == null ? headA : b.next);
}
return a
}
LeeCode 142: 环形链表 II
题目描述:
给你一个链表的头节点
head,返回链表开始入环的第一个节点,如果链表无环则返回null。
标签:链表,双指针
时间复杂度:O(N)
建立模型:
设 链表头部到环之前有 a 个节点, 链表环内有 b 个节点
定义快慢指针
fast, slow,fast每次走两步,slow每次走一步若 fast 走到链表尾部,则说明链表无环 return null
若 fast 与 slow 相遇,则 fast 与 slow 走过的路程关系有:
\[\begin{cases}
fast = 2 * slow \\
fast - slow = n * b
\end{cases}\qquad
\Rightarrow
\qquad\begin{cases}
fast = 2 * n * b \\
slow = n * b
\end{cases}
\]且 slow 指针每次走到链表环的第一个节点时步数表达式为:\(slow = a + n * b\)
所以 slow 与 fast 相遇后再走 a 步即可到达链表环的第一个节点
如何确定 a 呢?
将 fast 指针重新指向 head,head 走 a 步也到达链表环的第一个节点,即同时移动 fast 和 slow,直至其第二次相遇
代码实现:
# Python 3实现
def detectCycle(self, head: ListNode) -> ListNode:
slow, fast = head, head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
if slow == fast:
break
if not (fast and fast.next):
return None
fast = head
while fast != slow:
slow, fast = slow.next, fast.next
return slow
// Java 实现
public ListNode detectCycle(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if (slow == fast) {
break;
}
}
if (fast == null || fast.next == null) {
return null;
}
fast = head;
while (slow != fast) {
slow = slow.next;
fast = fast.next;
}
return slow;
}
LeeCode链表问题(二)的更多相关文章
- [LeetCode] Convert Sorted List to Binary Search Tree 将有序链表转为二叉搜索树
Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...
- [LeetCode] Reverse Linked List II 倒置链表之二
Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1-> ...
- LeetCode(109):有序链表转换二叉搜索树
Medium! 题目描述: 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: ...
- LeetCode109. 有序链表转换二叉搜索树
109. 有序链表转换二叉搜索树 问题描述 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超 ...
- [LeetCode] 92. Reverse Linked List II 倒置链表之二
Reverse a linked list from position m to n. Do it in one-pass. Note: 1 ≤ m ≤ n ≤ length of list. Exa ...
- Java实现 LeetCode 109 有序链表转换二叉搜索树
109. 有序链表转换二叉搜索树 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. ...
- [LeetCode 109] - 将已排序链表转换为二叉搜索树 (Convert Sorted List to Binary Search Tree)
问题 给出一个元素以递增序列排序的单链表,将其转换为一棵高度平衡的二叉搜索树. 初始思路 二叉搜索树高度平衡,意味着左右子树的高度要平衡.根据二叉树左子树节点小于根节点,右子树节点大于根节点的性质:我 ...
- [Swift]LeetCode109. 有序链表转换二叉搜索树 | Convert Sorted List to Binary Search Tree
Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...
- 有序链表转换二叉搜索树(LeetCode)
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10,-3,0, ...
- LeetCode 109——有序链表转化二叉搜索树
1. 题目 2. 解答 2.1. 方法一 在 LeetCode 108--将有序数组转化为二叉搜索树 中,我们已经实现了将有序数组转化为二叉搜索树.因此,这里,我们可以先遍历一遍链表,将节点的数据存入 ...
随机推荐
- 第11章 配置ASP.NET Core应用程序(ASP.NET Core in Action, 2nd Edition)
本章包括 从多个配置提供程序加载设置 安全存储敏感设置 使用强类型设置对象 在不同的宿主环境中使用不同的设置 在本书的第1部分中,您学习了ASP.NET Core应用程序启动和运行的基础知识,以及如何 ...
- 3、一个简单的Java应用程序
/* 1.Java中区分大小写,如果出现了大小写拼写错误,例如将main拼写成Main,则程序将无法运行. 2.关键字public成为访问修饰符,用来控制程序的其他部分对这段代码的访问级别. 3.关键 ...
- k8s重启应用
[root@k8s-master01 opt_k8s]# cat app_list xxx-supervise-srv xxx-recon-srv xxx-mkt-strategy-srv xxx-u ...
- Linux下将普通用户文件移动到root用户下
步骤: 将普通用户的文件拷贝到tmp目录下 cp /Desktop/1.txt /tmp 从普通用户切到root用户 su - root用户从tmp中取文件到指定目录/var/test cp /tmp ...
- NX二次开发 拔模增量计算工具
在塑胶模具设计行业拔模增量计算经常都需要用到,平常都是利用计算器工具或者外部的计算工具去算.曾经有一个模具设计的培训老师把拔模增量计算工具称为模具设计的神器,好吧,我也造个神器.-_-! VS2019 ...
- WSL安装Ubuntu 22.04 (1)
1. 安装WSL WSL是适用于 Linux 的 Windows 子系统可让开发人员按原样运行 GNU/Linux 环境 - 包括大多数命令行工具.实用工具和应用程序 - 且不会产生传统虚拟机或双启动 ...
- React16下报错引发整个页面crash的解决方法
如果报错没有没有被catch,将会引起整个React组件树的unmounting 解决方法:在生命周期中增加componentDidCatch https://reactjs.org/blog/201 ...
- Caused by: java.lang.NoSuchMethodError
ERROR [localhost-startStop-1] - Context initialization failedorg.springframework.beans.factory.BeanD ...
- 论文解读(ToAlign)《ToAlign: Task-oriented Alignment for Unsupervised Domain Adaptation》
论文信息 论文标题:ToAlign: Task-oriented Alignment for Unsupervised Domain Adaptation论文作者:Guoqiang Wei, Cuil ...
- J - Straight Master Gym - 101775J 差分
题意:纸牌顺子:连续的3张或连续的4张或连续的5张为顺子.手中的牌共有n个数字,每个数字是a[i]个,能不能把手中所有的牌都是属于顺子. 1 ≤ T ≤ 100. 1 ≤ N ≤ 2 × 105. 0 ...