【刷力扣 TS 版】难度 简单 链表专题(二)

简介: 【刷力扣 TS 版】难度 简单 链表专题(二)

原文来自 我的个人博客

前言

拒绝摆烂ヾ(◍°∇°◍)ノ゙

从今天开始(2023/02/12),定一个小目标,先刷个 300Leetcode 题目(之前刷的不计入)。

当然作为一个小前端,我选择的语言是 TS,而且刷的题目的难度会偏中等一些,大概按照 简单3 中等6 困难1 这样的题型分布吧。嗯,目前是这么打算的。

本题 Github 地址:因为比较喜欢 vscode 的界面,而且方便调试,所以 AC 完就顺便提到 github 了,也算做一个记录吧。

本篇的题目是这个系列的第

  1. NO.9876. 链表的中间节点
  2. NO.10面试题 02.02. 返回倒数第 k 个节点
  3. NO.11剑指 Offer 06. 从尾到头打印链表

难度都为 简单

我们开始吧,Here We Go~

1. 链表的中间节点

1.1 题目描述

给定一个头结点为 head 的非空单链表,返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

示例 1:

输入: [1,2,3,4,5]
输出: 此列表中的结点 3 (序列化形式:[3,4,5])
返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
注意,我们返回了一个 ListNode 类型的对象 ans,这样:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.

示例 2:

输入: [1,2,3,4,5,6]
输出: 此列表中的结点 4 (序列化形式:[4,5,6])
由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。

提示:

  • 给定链表的结点数介于 1 和 100 之间。

1.2 解:快慢指针

思路:定量一个快指针 fast,一个慢指针 slow,快指针每次都指向下下个节点,慢指针每次都指向下个节点,直到 fast.next 为 null 或者 fast.next.next 为 null

注意:当 fast.next 不为 nullfast.next.next 为 null(即链表的长度为偶数时),最终的 slow 还要往后移以为。

function middleNode(head: ListNode | null): ListNode | null {
  let fast: ListNode | null = head
  let slow: ListNode | null = head

  while(fast && fast.next) {
    fast = fast.next.next
    slow = slow.next
  }

  return slow
}

复杂度分析:

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

2. 面试题 02.02. 返回倒数第 k 个节点

2.1 题目描述

实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。

注意: 本题相对原题稍作改动

示例:

输入: 1->2->3->4->5 和 k = 2
输出: 4

说明:

给定的 k 保证是有效的。

2.2 解

这道题比较简单,思路就是先遍历一遍链表获取链表的长度 len,随后再遍历一次链表,找到第 len - k 位节点就是所求节点。

function kthToLast(head: ListNode | null, k: number): number {
  let len: number = 0;

  let current: ListNode | null = head;
  while (current) {
    len++;
    current = current.next;
  }
  current = head;
  for (let i = 0; i <= len; i++) {
    if (i == len - i) return current.val;
    current = current.next;
  }
}

3. 面试题06. 从尾到头打印链表

3.1 题目描述

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

 

示例 1:

输入: head = [1,3,2]
输出: [2,3,1]

 

限制:

0 <= 链表长度 <= 10000

3.2 解

这题比较简单,我们只要遍历链表然后从头部插入数组即可。

function reversePrint(head: ListNode | null): number[] {
  const ret: number[] = []

  let current: ListNode | null = head
  while(current) {
    ret.unshift(current.val)
    current = current.next
  }

  return ret
};

复杂度分析:

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
相关文章
|
1月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
36 1
|
1月前
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
50 0
Leetcode第21题(合并两个有序链表)
|
1月前
|
算法
【链表】算法题(二) ----- 力扣/牛客
【链表】算法题(二) ----- 力扣/牛客
|
1月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
18 0
LeetCode第二十四题(两两交换链表中的节点)
|
1月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
44 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
1月前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
78 0
|
1月前
【LeetCode 10】142. 环形链表 II
【LeetCode 10】142. 环形链表 II
21 0
|
1月前
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
17 0
|
1月前
【LeetCode 08】206 反转链表
【LeetCode 08】206 反转链表
12 0
|
1月前
【LeetCode 06】203.移除链表元素
【LeetCode 06】203.移除链表元素
30 0