第一页总结

第一页总结

  • 链表
    • 反转
      • 206. 反转链表
      • 25. K 个一组翻转链表
    • 双指针
      • 21. 合并两个有序链表
      • 141. 环形链表

链表

反转

206. 反转链表

206. 反转链表
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。


递归思路:
每一个子递归都将当前节点下一个节点的下一个节点指向当前节点,当前节点的下一个节点置空。 递归终止条件:head为空或head.next为空。


复杂度分析

  • 时间复杂度:O(n),其中 n 是链表的长度。需要对链表的每个节点进行反转操作。
  • 空间复杂度:O(n),其中 n 是链表的长度。空间复杂度主要取决于递归调用的栈空间,最多为 n 层。
class Solution {public ListNode reverseList(ListNode head) {if(head==null || head.next==null){return head;}ListNode newHead = reverseList(head.next);head.next.next = head;head.next=null;return newHead;}
}

迭代思路:用pre和cur两个指针遍历链表
复杂度分析

  • 时间复杂度:O(n),其中 n 是链表的长度,需要遍历链表一次。
  • 空间复杂度:O(1)
class Solution {public ListNode reverseList(ListNode head) {ListNode prev = null;ListNode curr = head;while (curr != null) {ListNode next = curr.next;curr.next = prev;prev = curr;curr = next;}return prev;}
}

25. K 个一组翻转链表

25. K 个一组翻转链表
给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。
k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。


递归思路:k个一组翻转链表,对于每一组来说就是反转前n。所以可以采用递归的思想,首先找到下一个要翻转前n的节点,再翻转当前head的前n个节点,最后递归的反转后续链表并连接起来。


时间复杂度分析:
复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
class Solution {public ListNode reverseKGroup(ListNode head, int k) {ListNode p = head;// 找到下一个要反转前n的headfor(int i=0;i<k;i++){if(p==null){return head;}p=p.next;}// 反转前NListNode newHead = reverseN(head,k);head.next = reverseKGroup(p,k);return newHead;}/**反转前N*/ListNode successor = null;private ListNode reverseN(ListNode head, int n){// 找到第一个不用反转的节点if(n==1){successor = head.next;return head;}ListNode newHead = reverseN(head.next, n-1);head.next.next = head;head.next = successor;return newHead;}
}

迭代:
时间复杂度:O(n),其中 n 为链表的长度。head 指针会在 O(⌊n/k⌋)个节点上停留,每次停留需要进行一次 O(k)的翻转操作。
空间复杂度:O(1).

class Solution {public ListNode reverseKGroup(ListNode head, int k) {ListNode hair = new ListNode(0);hair.next = head;ListNode pre = hair;while (head != null) {ListNode tail = pre;// 查看剩余部分长度是否大于等于 kfor (int i = 0; i < k; ++i) {tail = tail.next;if (tail == null) {return hair.next;}}ListNode nex = tail.next;ListNode[] reverse = myReverse(head, tail);head = reverse[0];tail = reverse[1];// 把子链表重新接回原链表pre.next = head;tail.next = nex;pre = tail;head = tail.next;}return hair.next;}public ListNode[] myReverse(ListNode head, ListNode tail) {ListNode prev = tail.next;ListNode p = head;while (prev != tail) {ListNode nex = p.next;p.next = prev;prev = p;p = nex;}return new ListNode[]{tail, head};}
}

双指针

相关题目:双指针秒杀七道链表题目

21. 合并两个有序链表

21. 合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。


思路:比较两个链表的大小,将更小的接到p指针。

复杂度分析

  • 时间复杂度:O(n+m),其中 n和 m分别为两个链表的长度。因为每次循环迭代中,l1 和 l2 只有一个元素会被放进合并链表中, 因此 while 循环的次数不会超过两个链表的长度之和。所有其他操作的时间复杂度都是常数级别的,因此总的时间复杂度为 O(n+m)。

  • 空间复杂度:O(1)。我们只需要常数的空间存放若干变量。

class Solution {public ListNode mergeTwoLists(ListNode list1, ListNode list2) {ListNode dummy = new ListNode(-1);ListNode p = dummy;while(list1!=null && list2!=null){if(list1.val<list2.val){p.next = list1;list1 = list1.next;}else{p.next = list2;list2 = list2.next;}p = p.next;}if(list1!=null){p.next = list1;}if(list2!=null){p.next = list2;}return dummy.next;}
}

141. 环形链表

141. 环形链表
判断链表是否有环


思路:通过快慢指针,如果相遇则有环。
复杂度分析

  • 时间复杂度:O(N),其中N是链表中的节点数。
    当链表中不存在环时,快指针将先于慢指针到达链表尾部,链表中每个节点至多被访问两次。
    当链表中存在环时,每一轮移动后,快慢指针的距离将减小一。而初始距离为环的长度,因此至多移动 NNN 轮。

  • 空间复杂度:O(1)。我们只使用了两个指针的额外空间。

public class Solution {public boolean hasCycle(ListNode head) {if(head==null){return false;}ListNode fast = head;ListNode slow = head;while(fast!=null && fast.next!=null){slow = slow.next;fast=fast.next.next;// 快慢指针相遇则有环if(fast==slow){return true;}}return false;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/853343.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是专业的CRM客户管理系统,介绍crm客户管理系统的功能作用

CRM&#xff08;Customer Relationship Management&#xff09;客户管理系统&#xff0c;是现代企业不可或缺的一款管理工具。它集客户信息管理、销售自动化、客户服务与支持、数据分析与决策支持等多项功能于一身&#xff0c;帮助企业实现客户关系的全方位管理&#xff0c;从而…

浏览器必备插件:最新Allow copy万能网页复制下载,解锁网页限制!

今天阿星给大家安利一个超级实用的小工具&#xff0c;专治那些“禁止复制”的网页文字。学生党、资料搜集狂人&#xff0c;你们有福了&#xff01; 想象一下&#xff0c;你在网上冲浪&#xff0c;突然遇到一篇干货满满的文章&#xff0c;正想复制下来慢慢品味&#xff0c;结果…

CubeMX Keil Configure

// 使用外部高速晶振 外部高速晶振为8M&#xff08;根据开发板上的晶振频率设置&#xff09;&#xff0c;使用 PLLCLK&#xff0c;HSE 选项 USART1 使用 Asynchronous&#xff0c;PA9&#xff0c;PA10引脚&#xff08;USART1 引脚根据开发板上引脚设置&#xff09; 设置MDK AR…

Docker Nginx

Docker官网 https://www.docker.com/https://www.docker.com/ 删除原先安装的Docker sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ …

android13 应用冷启动

1 概述 launcher 通过binder到systemserver中atms中发送startActivity请求 startProcess向zygote发送启动新进程请求 zygote收到请求&#xff0c;fork新进程并调用ActivityThread的main初始化 新进程启动&#xff0c;发送attachApplication给ams&#xff0c;告诉他新进程启动…

vuex是什么?如何使用?使用他的功能场景?

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 也集成到 Vue 官方的开发者工具 extension 中&#xff0c;提供了诸如零配置的 time-travel 调试、状态快照…

php环境变量$_ENV详解

在PHP中&#xff0c;$_ENV 是一个预定义的全局变量&#xff0c;它是一个关联数组&#xff0c;用来存储来自环境变量的信息。环境变 量是在操作系统中设置的、与正在运行的程序相关的变量&#xff0c;可以包含关于系统环境、路径、用户设置等信息。 获取环境变量 当你需要在P…

多维数组切片

使用切片的种类 第一种&#xff1a;使用单个冒号&#xff0c;最全的切片结构&#xff1a;[ start:stop:interval ]第二种&#xff1a;连续使用两个冒号获取带间隔的序列元素或者是实现特定的结果&#xff0c;比如逆序列。多维切片---考虑广播性质 本文要重点提醒的是 多维数组在…

希亦、添可、石头洗地机哪款好用?2024洗地机深度测评

今年的洗地机市场竞争异常激烈&#xff0c;各大品牌纷纷推出了自己的旗舰产品。这对消费者来说是个好消息&#xff0c;因为有更多的选择空间。然而&#xff0c;面对如此多的优质洗地机&#xff0c;选择合适的一款也成了一种“幸福的烦恼”。 作为一个专业的测评人士&#xff0…

kaggle竞赛实战10——特征优化

特征优化思路&#xff1a; 在完成常规流程后&#xff0c;如果不知道怎么办&#xff0c;可以针对文本or时间序列特征进行进一步处理 首先&#xff0c;我们注意到&#xff0c;每一笔信用卡的交易记录都有交易时间&#xff0c;而对于时间字段和文本字段&#xff0c;普通的批量创…

AI赋能软件测试

AI赋能软件测试 AI赋能软件测试软件测试分类软件质量模型:用来衡量软件质量的维度AI赋能软件测试 随着AI时代的到来,如何轻松掌握软件测试新趋势,将AI技术应用于软件测试行业,提高测试速度与测试效率~~ 传智星云AI助手:https://nebula.itcast.cn tips:各种AI工具应有尽有…

git使用http协议时免密pull和push方法

1、创建文件 在项目目录下创建.git-credentials文件&#xff0c;内容如下&#xff0c;填入自己的用户名和密码即可&#xff0c;如果是gitlab&#xff0c;把地址换成自己的gitlab的地址即可。 https://{用户名}:{密码}github.com2、终端执行 git config --global credential.…

特效(Effect)

特效(Effect) 特效,即特殊效果,是在电影、电视、游戏等领域中,通过视觉、声音、物理等手段创造出的非现实或超现实的效果。随着科技的发展,特效已经成为了现代娱乐产业中不可或缺的一部分。本文将深入探讨特效的定义、类型、制作过程及其在各个领域中的应用。 特效的定…

C# —— switch语句

作用 &#xff1a; 让顺序执行的代码 产生分支 switch基本语法 switch (变量) { case 常量: 满足条件执行的代码逻辑 break; 跳出 打断 下面不会再执行判断 如果不加 下面依旧会进行判断 …

07:打印ASCII码

OpenJudge - 07:打印ASCII码 描述 输入一个除空格以外的可见字符&#xff08;保证在函数scanf中可使用格式说明符%c读入&#xff09;&#xff0c;输出其ASCII码。 输入 一个除空格以外的可见字符。 输出 一个十进制整数&#xff0c;即该字符的ASCII码。 >>>>>&g…

C#参数使用场景简要说明

C#参数使用场景简要说明 1、传值参数 方法、类成员的初始化 2、输出参数 方法返回值不能满足&#xff0c;需要多个返回值时&#xff1b; 3、引用参数 方法需要修改变量需带回原变量时&#xff1b; 4、具名参数 代码可读性高&#xff0c;参数可交换位置 5、方法扩展&#xff08…

LeetCode | 66.加一

这道题有多个思路&#xff0c;可以依次取数组的每一位&#xff0c;乘10后加下一位&#xff0c;直到最后一位&#xff0c;就得到我们数组所表示的数字&#xff0c;然后加一&#xff0c;然后把新得到的数字再转化为对应的数组&#xff0c;我的做法是直接取数组的最后一位&#xf…

人工智能GPU互联技术分析,芯片巨头UALink向英伟达NVLink开战

芯片巨头组团&#xff0c;向英伟达NVLink开战 八大科技巨头——AMD、博通、思科、Google、惠普企业、英特尔、Meta及微软——联合推出UALink&#xff08;Ultra Accelerator Link&#xff09;技术&#xff0c;为人工智能数据中心网络设定全新互联标准。此举旨在打破Nvidia的市场…

Python 小市值股票模型代码及回测分析

目录 一、模型介绍 二、代码详解 2.1 初始化函数 2.2 股票筛选过滤函数 2.3 止损函数 2.4 开盘时运行函数 2.5 调仓函数 三、回测结果分析 3.1 收益净值图与概述 3.2 模型收益概览 3.3 年度收益图 3.4 月度收益的时间序列 3.5 月度收益热力图 3.6 月度收益频次分…

java之IO流和集合框架的笔记

1 File类的使用 1.1 概述 File类及本章下的各种流&#xff0c;都定义在java.io包下。 一个File对象代表硬盘或网络中可能存在的一个文件或者文件目录&#xff08;俗称文件夹&#xff09;&#xff0c;与平台无关。&#xff08;体会万事万物皆对象&#xff09; File 能新建、删…