重庆秀山网站建设价格/成都搜狗seo

重庆秀山网站建设价格,成都搜狗seo,南阳做网站的,成都百度网站优化链表 1. 相交链表问题描述解决思路代码实现 2. 反转链表问题描述解决思路代码实现 3. 回文链表问题描述解决思路代码实现 4. 环形链表问题描述解决思路代码实现 5. 环形链表II问题描述解决思路代码实现 6. 合并两个有序链表问题描述解决思路代码实现 7. 两数相加问题描述解决思…

链表

  • 1. 相交链表
    • 问题描述
    • 解决思路
    • 代码实现
  • 2. 反转链表
    • 问题描述
    • 解决思路
    • 代码实现
  • 3. 回文链表
    • 问题描述
    • 解决思路
    • 代码实现
  • 4. 环形链表
    • 问题描述
    • 解决思路
    • 代码实现
  • 5. 环形链表II
    • 问题描述
    • 解决思路
    • 代码实现
  • 6. 合并两个有序链表
    • 问题描述
    • 解决思路
    • 代码实现
  • 7. 两数相加
    • 问题描述
    • 解决思路
    • 代码实现

1. 相交链表

问题描述

给定两个单链表 headAheadB,它们可能在某个节点相交。请编写一个函数来查找它们的第一个交点。若没有交点,返回 null

解决思路

  1. 计算链表的长度:首先,遍历两个链表,分别计算它们的长度 lenAlenB

  2. 调整起始点:确定较长链表的起始位置,使得两个链表的剩余部分长度相同。通过让较长链表先走长度差步,保证两个链表在相同的“距离剩余部分”的起点上对齐。

  3. 同步遍历:同步遍历两个链表,如果它们的当前节点相同,则返回该节点作为交点。如果遍历结束都没有找到交点,返回 null

代码实现

public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {int lenA = 0, lenB = 0;ListNode curA = headA;ListNode curB = headB;// 计算链表A和B的长度while (curA != null) {lenA++;curA = curA.next;}while (curB != null) {lenB++;curB = curB.next;}curA = headA;curB = headB;// 让curA为最长链表的头,lenA为其长度if (lenB > lenA) {// 交换(lenA, lenB)int tmpLen = lenA;lenA = lenB;lenB = tmpLen;// 交换(curA, curB)ListNode tmpNode = curA;curA = curB;curB = tmpNode;}// 求长度差int gap = lenA - lenB;// 让curA和curB在同一起点上(末尾位置对齐)while (gap-- > 0) {curA = curA.next;}// 现在在同一起点上同步遍历while (curA != null) {if (curA == curB) return curA;  // 找到交点curA = curA.next;curB = curB.next;}return null;  // 没有交点}
}

2. 反转链表

问题描述

给定一个单链表的头节点 head,请编写一个函数来反转该链表,并返回反转后的链表。

解决思路

  1. 初始化

    • 创建三个指针:cur 指向当前节点,pre 指向前一个节点,temp 用来暂存当前节点的下一个节点。
  2. 反转操作

    • 遍历链表的每个节点。在遍历过程中,将当前节点的 next 指针指向前一个节点,从而实现链表的反转。
    • 使用 cur.next = pre 将当前节点与前一个节点连接,然后将 pre 更新为当前节点,cur 更新为下一个节点。
  3. 结束遍历

    • curnull 时,遍历结束,此时 pre 就是反转后的链表的头节点。
  4. 返回结果

    • 返回 pre,即反转后的链表的头节点。

代码实现

public class Solution {public ListNode reverseList(ListNode head) {ListNode cur = head;  // 当前节点ListNode pre = null;  // 前一个节点ListNode temp = null; // 临时节点,保存当前节点的下一个节点while (cur != null) {temp = cur.next;  // 暂存当前节点的下一个节点cur.next = pre;   // 反转当前节点的指针pre = cur;        // 移动前一个节点指针cur = temp;       // 移动当前节点指针}return pre;  // 返回反转后的链表头节点}
}

3. 回文链表

问题描述

给定一个单链表的头节点 head,判断该链表是否为回文链表。回文链表是指从前往后和从后往前读的链表内容一致。

解决思路

  1. 寻找链表的中间节点

    • 使用快慢指针法,快指针 fast 每次移动两步,慢指针 slow 每次移动一步。当快指针到达链表末尾时,慢指针正好指向链表的中间节点。
  2. 反转链表的后半部分

    • 从中间节点开始,将链表的后半部分反转,这样就能方便地和前半部分进行比较。
  3. 比较前半部分和反转后的后半部分

    • 比较链表的前半部分和反转后的后半部分的节点值。如果有任何不相等的节点,说明链表不是回文链表。
  4. 返回结果

    • 如果没有发现不相等的节点,说明链表是回文的。

代码实现

public class Solution {public boolean isPalindrome(ListNode head) {// 找到中间节点,把后半部分反转,然后比较ListNode middle = getMiddle(head);ListNode head2 = reverseList(middle);// 获得的反转链表长度只有原来的一半, 所以这里用head2来做循环停止条件while (head2 != null) {if (head.val != head2.val) {return false;}head = head.next;head2 = head2.next;}return true;}// 快慢指针,找到链表的中间节点public ListNode getMiddle(ListNode head) {ListNode fast = head;ListNode slow = head;while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;}return slow;}// 反转链表public ListNode reverseList(ListNode head) {ListNode p = null;ListNode q = head;while (q != null) {ListNode tmp = q.next;q.next = p;p = q;q = tmp;}return p;}
}

4. 环形链表

问题描述

给定一个单链表 head,判断该链表是否有环。若链表中存在环,则返回 true;否则返回 false

解决思路

使用 快慢指针(Floyd’s Cycle Detection Algorithm,也叫快慢指针法)来判断链表中是否有环。具体步骤如下:

  1. 初始化指针

    • 使用两个指针,慢指针 slow 每次向后移动一步,快指针 fast 每次向后移动两步。
  2. 循环遍历链表

    • 每次移动慢指针和快指针,直到快指针到达链表的末尾(即没有环的情况)。
    • 如果快指针和慢指针相遇,则说明链表中存在环。
  3. 处理特殊情况

    • 如果链表为空或者只有一个节点时,直接返回 false,因为没有环。

代码实现

public class Solution {public boolean hasCycle(ListNode head) {// 特殊情况判断:链表为空或只有一个节点if (head == null || head.next == null) {return false;}ListNode slow = head;          // 慢指针ListNode fast = head.next;     // 快指针// 快慢指针遍历链表while (slow != fast) {// 如果快指针到达链表末尾,则说明没有环if (fast == null || fast.next == null) {return false;}// 移动慢指针和快指针slow = slow.next;fast = fast.next.next;}// 快慢指针相遇,说明有环return true;}
}

5. 环形链表II

问题描述

给定一个链表,如果链表中存在环,返回环的起始节点;否则,返回 null

解决思路

  1. 使用哈希集合

    • 我们可以通过遍历链表并将每个节点存储到一个哈希集合中。如果某个节点已经存在于集合中,则说明链表有环,返回该节点。
    • 如果链表没有环,那么遍历完链表所有节点后,集合不会重复任何元素,最终返回 null
  2. 时间复杂度

    • 每个节点最多会被访问一次,因此时间复杂度是 O(n),其中 n 是链表的长度。
  3. 空间复杂度

    • 由于使用了哈希集合来存储链表节点,因此空间复杂度为 O(n),其中 n 是链表的长度。

代码实现

public class Solution {public ListNode detectCycle(ListNode head) {// 用哈希集合来记录访问过的节点Set<ListNode> seen = new HashSet<>();// 遍历链表while (head != null) {// 如果当前节点已经出现过,说明存在环,返回当前节点if (!seen.add(head)) {return head;}// 将当前节点的下一个节点继续遍历head = head.next;}// 链表没有环,返回nullreturn null;}
}

6. 合并两个有序链表

问题描述

给定两个有序链表 list1list2,将它们合并成一个有序链表,并返回新的链表。

解决思路

我们可以使用一个虚拟的头节点 head3,通过逐步遍历 list1list2,按顺序将它们的节点加入到新链表中。

  1. 虚拟头节点:通过引入虚拟头节点,简化了合并操作,避免了在合并过程中的特殊情况处理(例如初始时没有头节点)。
  2. 遍历两个链表:同时遍历两个链表,比较它们的节点值,将较小的节点加入新链表。
  3. 处理剩余节点:在某一链表遍历结束后,直接将新链表的尾部指向另一个链表的剩余部分。
  4. 返回结果:最终返回虚拟头节点的 next,即合并后的链表。

代码实现

public class Solution {public ListNode mergeTwoLists(ListNode list1, ListNode list2) {ListNode head3 = new ListNode(); // 虚拟头节点ListNode cur = head3; // 当前指针,指向新链表的尾部// 同时遍历两个链表,直到其中一个链表为空while (list1 != null && list2 != null) {if (list1.val <= list2.val) {cur.next = list1;list1 = list1.next; // 移动 list1 指针} else {cur.next = list2;list2 = list2.next; // 移动 list2 指针}cur = cur.next; // 移动当前指针}// 合并后,只有一个链表可能没有遍历完,直接将未遍历完的链表接到新链表的末尾cur.next = (list1 == null) ? list2 : list1;// 返回新链表的头节点return head3.next;}
}

7. 两数相加

问题描述

给定两个非空链表,表示两个非负整数。数字按逆序存储,每个节点包含一个数字。将这两个数相加,返回一个新的链表表示它们的和。

解决思路

  1. 模拟逐位相加

    • 从两个链表的头节点开始,对应位的数值相加。若有进位,则加到下一位。
    • 如果某个链表已经遍历完,认为它对应的数为0,继续计算。
    • 最后,如果仍有进位,需要在链表末尾添加一个新的节点。
  2. 进位处理

    • 进位通过 carry 变量来管理,逐位传递到下一个节点。
  3. 链表结构

    • 使用一个虚拟链表(通过 headtail)来构建结果链表。

代码实现

public class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {ListNode head = null, tail = null; // 用于构建结果链表int carry = 0; // 进位// 遍历链表,直到两个链表都为空while (l1 != null || l2 != null) {// 如果某个链表到达末尾,则认为该链表对应的值为0int n1 = (l1 != null) ? l1.val : 0;int n2 = (l2 != null) ? l2.val : 0;int sum = n1 + n2 + carry; // 计算当前位的和(包含进位)// 如果是第一个节点if (head == null) {head = new ListNode(sum % 10); // 取个位数作为新节点tail = head; // `tail` 指向新节点} else {tail.next = new ListNode(sum % 10); // 创建新节点并添加到链表tail = tail.next; // 更新 `tail` 指针}carry = sum / 10; // 计算进位,传递到下一个节点// 移动到下一个节点if (l1 != null) {l1 = l1.next;}if (l2 != null) {l2 = l2.next;}}// 如果最终有进位,添加一个新节点if (carry > 0) {tail.next = new ListNode(carry);}return head; // 返回结果链表的头节点}
}

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

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

相关文章

【Python pro】基本数据类型

一、数字类型 1.1 数字类型的组成 1.1.1 整数 &#xff08;1&#xff09;十进制&#xff0c;二进制0b&#xff0c;八进制0o&#xff0c;十六进制0x print(16 0b10000 0o20 0x10) # 输出&#xff1a;True&#xff08;2&#xff09;十进制转其他进制 a bin(16) b oct(1…

拯救者电脑在重装系统之后电源计划丢失Fn+Q切换不了模式怎么恢复?

参考联想知识库的一下链接&#xff1a; https://iknow.lenovo.com.cn/detail/196192 其中下载的解压文件后的文件需要复制粘贴到D盘的根目录下&#xff0c;再来运行文件。若在生成的log文件中看到导入成功以及控制面板中看到已添加的电源计划即可 如果还是无效可是试试以下的…

ubuntu 执行 sudo apt-get update 报错

记录一下&#xff0c;遇到这个问题了&#xff0c;网络上看到的解决办法&#xff0c;亲测有效 执行sudo apt-get update ,却报以下错误&#xff0c;“SECURITY: URL redirect target contains control characters rejecting ” 经检查发现&#xff0c;/etc/apt/source.list 下的…

深度集成DeepSeek大模型:WebSocket流式聊天实现

目录 5分钟快速接入DeepSeek大模型&#xff1a;WebSocket实时聊天指南创建应用开发后端代码 (Python/Node.js)结语 5分钟快速接入DeepSeek大模型&#xff1a;WebSocket实时聊天指南 创建应用 访问DeepSeek官网 前往 DeepSeek官网。如果还没有账号&#xff0c;需要先注册一个。…

java断点调试(debug)

在开发中&#xff0c;新手程序员在查找错误时, 这时老程序员就会温馨提示&#xff0c;可以用断点调试&#xff0c;一步一步的看源码执行的过程&#xff0c;从而发现错误所在。 重要提示: 断点调试过程是运行状态&#xff0c;是以对象的运行类型来执行的 断点调试介绍 断点调试是…

软件技术实训室解决方案(2025年最新版)

软件产业作为新兴产业的核心组成部分&#xff0c;是推动数字经济发展的重要力量。在“十四五”规划的新机遇与挑战下&#xff0c;我国已明确将加强关键数字技术创新应用作为战略重点&#xff0c;并将软件和信息技术服务业的发展列为重中之重。这不仅是为了加速构建现代产业体系…

foobar2000设置DSP使用教程及软件推荐

foobar2000安卓中文版&#xff1a;一款高品质手机音频播放器 foobar2000安卓中文版是一款备受好评的高品质手机音频播放器。 几乎支持所有的音频格式&#xff0c;包括 MP3、MP4、AAC、CD 音频等。不论是经典老歌还是最新的流行音乐&#xff0c;foobar2000都能完美播放。除此之…

DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地

对于个人开发者或尝鲜者而言&#xff0c;本地想要部署 DeepSeek 有很多种方案&#xff0c;但是一旦涉及到企业级部署&#xff0c;则步骤将会繁琐很多。 比如我们的第一步就需要先根据实际业务场景评估出我们到底需要部署什么规格的模型&#xff0c;以及我们所要部署的模型&…

EXCEL解决IF函数“您已为此函数输入太多个参数”的报错

IF函数的基本结构是IF(条件, 值为真时的结果, 值为假时的结果)&#xff0c;所以标准的IF函数最多只能有三个参数。当用户输入的参数超过三个时&#xff0c;Excel就会报这个错误。比如多个IF语句叠加&#xff0c;但可能在嵌套的过程中没有正确关闭每个IF函数的括号&#xff0c;导…

图像质量评价指标-UCIQE-UIQM

一、评价指标UCIQE 在文章《An underwater color image quality evaluation metric》中&#xff0c;提到的了评价指标UCIQE&#xff08;Underwater Colour Image Quality Evaluation&#xff09;&#xff0c;是一种无参考图像质量评价指标&#xff0c;主要用于评估水下图像的质…

基于Springboot+微信小程序调用文心一言大模型实现AI聊天

一、文章前言 此文主要实现基于Springboot微信小程序调用文心一言大模型实现AI聊天对话功能&#xff0c;使用Java作为后端语言进行支持&#xff0c;界面友好&#xff0c;开发简单。 二、开发流程及工具准备 2.1、登录百度智能云平台&#xff0c;获取 API Key 和 Secret Key两个…

python爬虫系列课程2:如何下载Xpath Helper

python爬虫系列课程2:如何下载Xpath Helper 一、访问极简插件官网二、点击搜索按钮三、输入xpath并点击搜索四、点击推荐下载五、将下载下来的文件解压缩六、打开扩展程序界面七、将xpath.crx文件拖入扩展程序界面一、访问极简插件官网 极简插件官网地址:https://chrome.zzz…

PHP支付宝--转账到支付宝账户

官方参考文档&#xff1a; ​https://opendocs.alipay.com/open/62987723_alipay.fund.trans.uni.transfer?sceneca56bca529e64125a2786703c6192d41&pathHash66064890​ 可以使用默认应用&#xff0c;也可以自建新应用&#xff0c;此处以默认应用来讲解【默认应用默认支持…

对称加密算法——IDEA加密算法

Java IDEA算法详解 1. 理论背景 IDEA&#xff08;International Data Encryption Algorithm&#xff09;是一种对称密钥加密算法&#xff0c;由Xuejia Lai和James Massey于1991年提出。它被设计用于替代DES&#xff08;Data Encryption Standard&#xff09;算法&#xff0c;…

rustdesk远程桌面自建服务器

首先&#xff0c;我这里用到的是阿里云服务器 centos7版本&#xff0c;win版客户端。 准备工作 centos7 服务器端文件&#xff1a; https://github.com/rustdesk/rustdesk-server/releases/download/1.1.11-1/rustdesk-server-linux-amd64.zip win版客户端安装包&#xff1…

【DL】浅谈深度学习中的知识蒸馏 | 输出层知识蒸馏

目录 一 核心概念与背景 二 输出层知识蒸馏 1 教师模型训练 2 软标签生成&#xff08;Soft Targets&#xff09; 3 学生模型训练 三 扩展 1 有效性分析 2 关键影响因素 3 变体 一 核心概念与背景 知识蒸馏&#xff08;Knowledge Distillation, KD&#xff09;是一种模…

嵌入式学习第十六天--stdio(二)

文件打开 open函数 #include <fcntl.h> int open(const char *pathname&#xff0c;int flags); int open(const char *pathname&#xff0c;int flags&#xff0c;mode_t mode); 功能: 打开或创建文件 参数: pathname //打开的文件名 flags //操作…

对话智面创始人陶然:一是初心和心态,二是坚持和心力

随着经济全球化的加深和市场竞争的日益激烈&#xff0c;企业迅速发展成为了每一个企业家的梦想。然而&#xff0c;要实现企业的快速发展并保持竞争力&#xff0c;企业战略的人力资源管理起着至关重要的作用。 企业的核心竞争力是“人才”的竞争&#xff0c;无论是研发、销售、…

mybatis使用typeHandler实现类型转换

使用mybatis作为操作数据库的orm框架&#xff0c;操作基本数据类型时可以通过内置的类型处理器完成java数据类型和数据库类型的转换&#xff0c;但是对于扩展的数据类型要实现与数据库类型的转换就需要自定义类型转换器完成&#xff0c;比如某个实体类型存储到数据库&#xff0…

Qt开发①Qt的概念+发展+优点+应用+使用

目录 1. Qt的概念和发展 1.1 Qt的概念 1.2 Qt 的发展史&#xff1a; 1.3 Qt 的版本 2. Qt 的优点和应用 2.1 Qt 的优点&#xff1a; 2.2 Qt 的应用场景 2.3 Qt 的应用案例 3. 搭建 Qt 开发环境 3.1 Qt 的开发工具 3.2 Qt SDK 的下载和安装 3.3 Qt 环境变量配置和使…