LeeCode 19: 删除链表的倒数第n个节点

题目描述:

给你一个链表,删除链表的倒数第 n 个节点,并返回链表的头节点。

标签:链表,双指针

时间复杂度:O(N)

建立模型:

  1. 定义虚拟头节点,使其 next 指向 head
  2. 定义快慢指针 fast,slow,slow指向虚拟头节点,fast指向第 n 个节点
  3. 同时移动 fast,slow,直至 fast 到达链表尾部
  4. 此时 slow 的 next 域指向的节点即是要删除的节点
  5. 删除 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: 链表相交

题目描述:

给你两个单链表的头节点 headAheadB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,则返回 null

标签:链表,双指针

时间复杂度:O(M+N)

建立模型:

  1. 假设链表 headA 长度为a,链表 headB 长度为b,链表相交长度为c
  2. 遍历完 headA 再遍历 headB,到起始公共节点,共经过 a + (b - c + 1) 个节点
  3. 遍历完 headB 再遍历 headA,到起始公共节点,共经过 b + (a - c + 1) 个节点
  4. 若 c = 0,即不存在公共节点,则当前节点 a,b 均指向 Null
  5. 若 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)

建立模型:

  1. 设 链表头部到环之前有 a 个节点, 链表环内有 b 个节点

  2. 定义快慢指针 fast, slow ,fast每次走两步,slow每次走一步

  3. 若 fast 走到链表尾部,则说明链表无环 return null

  4. 若 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}
    \]

  5. 且 slow 指针每次走到链表环的第一个节点时步数表达式为:\(slow = a + n * b\)

  6. 所以 slow 与 fast 相遇后再走 a 步即可到达链表环的第一个节点

  7. 如何确定 a 呢?

  8. 将 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链表问题(二)的更多相关文章

  1. [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 ...

  2. [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-> ...

  3. LeetCode(109):有序链表转换二叉搜索树

    Medium! 题目描述: 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: ...

  4. LeetCode109. 有序链表转换二叉搜索树

    109. 有序链表转换二叉搜索树 问题描述 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超 ...

  5. [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 ...

  6. Java实现 LeetCode 109 有序链表转换二叉搜索树

    109. 有序链表转换二叉搜索树 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. ...

  7. [LeetCode 109] - 将已排序链表转换为二叉搜索树 (Convert Sorted List to Binary Search Tree)

    问题 给出一个元素以递增序列排序的单链表,将其转换为一棵高度平衡的二叉搜索树. 初始思路 二叉搜索树高度平衡,意味着左右子树的高度要平衡.根据二叉树左子树节点小于根节点,右子树节点大于根节点的性质:我 ...

  8. [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 ...

  9. 有序链表转换二叉搜索树(LeetCode)

    将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10,-3,0, ...

  10. LeetCode 109——有序链表转化二叉搜索树

    1. 题目 2. 解答 2.1. 方法一 在 LeetCode 108--将有序数组转化为二叉搜索树 中,我们已经实现了将有序数组转化为二叉搜索树.因此,这里,我们可以先遍历一遍链表,将节点的数据存入 ...

随机推荐

  1. JSP和servlet之间的相互传值

    1.从一个jsp页面跳转到另一个jsp页面时的参数传递 (1)使用request对象获取客户端提交的信息 login.jsp页面代码如下: 点击查看代码 <%@ page language=&q ...

  2. Vue 加载显示源代码 , Vue 屏幕闪动

    1.当网络较慢,网页还在加载 Vue.js ,而导致 Vue 来不及渲染,这时页面就会显示出 Vue 源代码.我们可以使用 v-cloak 指令来解决这一问题. <style> [v-cl ...

  3. K8S的kubectl命令详解

    一.kubectl 基本命令 1.陈述式资源管理方法: 1.kubernetes集群管理集群资源的唯一入口是通过相应的方法调用apiserver的接口 2.kubectl 是官方的CLI命令行工具,用 ...

  4. 纯前端实现后端给数据进行文件导出——angular里面的使用

    interface dataList { cmd_cnt: number; risk_name: string; user_cnt: number; risk_type:string; } listO ...

  5. ES5及ES6的新增特性

    介绍 es表示ECMASCript ,他是从es3,es5,es6,es5是2009.12月发布的,es6是2015.6月发布的.vue2完全支持es5的(vue3完全支持es6的),react完全支 ...

  6. 量化交易-可视化展示(grafana)

    先上图 简单的实现了一下,效果还好,可玩性强 大概部署mysql+grafana step 1: 服务器:阿里云,ucloud啥的随意,配置也不需要什么,我的是阿里云1核1GB,足以 我用的ubunt ...

  7. 让 rtb 不显示 横纵 滚动条的方法

    让 rtb 不显示 横纵 滚动条的方法: a.设置属性: tb.ScrollBars=None; b.设置属性:rtb.WordWarp=False; c. 添加事件代码: rtb.ContentsR ...

  8. 将 Sql Server 表信息 C# 对象化 小工具_ 张光荣 的 正能量

    注: a.此程序所得到的结果是根据本人个人习惯生成,所以,肯定不完全适合所有人使用,重在想法...然后个人根据个人需求作出更进...b.程序中可能会出现数据库连接的错误提示[原因概是在sql 连接过程 ...

  9. HPA 弹性伸缩

    在k8s中,我们使用pod对外提供服务,这个时候,需要以下两种情形需要关注: pod因为不明原因挂掉,导致服务不可用 pod在高负载的情况下,不能支持我们的服务 如果人工监控pods,人工调整副本,那 ...

  10. Postman设置Cookie参数为全局变量-环境变量设置IP参数

    前提:在遇到多接口测试时,容易出现限制登录的情况 可以使用两种情况: 1.在调用其他接口前,先调用登录接口:这个方法在一般情况下可以,但是对于有些环境,比如像小程序登录时token(或cookie)是 ...