leetcode刷题(2):链表
文章目录1. 两数相加1.1 解题思路1.2 python 实现1. 3 c 实现2 删除排序链表中的重复元素 ||2.1 解题思路2.2 c 实现3 旋转链表3.1 解题思路3.2 c 实现4 剑指 Offer 06: 从尾到头打印链表4.1 解题思路4.2 c 实现5 剑指 Offer 24. 反转链表5.1 解题思路5.2 c实现21. 合并两个有序链表解题思路c 实现147. 对链表进行插入排序解题思路c实现19. 删除链表的倒数第 N 个结点解题思路c实现114. 二叉树展开为链表BM1 反转链表解题思路c 实现1. 两数相加题目给你两个 非空 的链表表示两个非负的整数。它们每位数字都是按照逆序的方式存储的并且每个节点只能存储 一位 数字。要求请你将两个数相加并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外这两个数都不会以 0 开头。提示每个链表中的节点数在范围 [1, 100] 内0 Node.val 9题目数据保证列表表示的数字不含前导零1.1 解题思路要求: 返回一个新链表存储两个逆序的链表之和返回的新链表也是逆序排列思路从链表的头开始按位加就可以计算出结果根据加法原则对应位置的计算结果为两数之和对10取余数同时 两数之和与10相除取整为向前进位的数字。1.2 python 实现# Definition for singly-linked list.# class ListNode:# def __init__(self, val0, nextNone):# self.val val# self.next nextclassSolution:defaddTwoNumbers(self,l1:Optional[ListNode],l2:Optional[ListNode])-Optional[ListNode]:t1[]curl1# 正确遍历只要当前节点不为空就取valwhilecur:t1.append(cur.val)curcur.next# 指针后移t2[]curl2whilecur:t2.append(cur.val)curcur.nextstr1.join([str(x)forxint1[::-1]])str2.join([str(x)forxint2[::-1]])totalint(str1)int(str2)# 构造链表题目要求低位在前所以反转字符串遍历dummyListNode()pdummy# str(num)是正序数字反转后低位先入链表 ,为什么要加str因为数字没法切片forcinstr(total)[::-1]:p.nextListNode(int(c))pp.nextreturndummy.next1. 3 c 实现解题1class Solution{public:ListNode*addTwoNumber(ListNode*l1,ListNode*l2){ListNode*dummynewListNode(-1);ListNode pdummy;bool carryfalse;while(l1||l2){intsum0;if(l1!nullptr){suml1-val;l1l1-next;}if(l2!nullptr){suml2-val;l2l2-next;}if(carry){sum;}p-nextnewListNode(sum%10);pp-next;if(sum10){carrytrue;}else{carryfalse;}}if(sum10){p-nextnewListNode(1);}returndummy-next;}}改进版/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */class Solution{public:ListNode*addTwoNumbers(ListNode*l1,ListNode*l2){//1. 创建一个dummy节点ListNode*dummynewListNode(-1);ListNode*pdummy;intt0;while(l1||l2||t){if(l1){tl1-val;l1l1-next;}if(l2){tl2-val;l2l2-next;}p-nextnewListNode(t%10);pp-next;tt/10;}returndummy-next;}};2 删除排序链表中的重复元素 ||对应为leetcode 82题中等难度。题目 给定一个已排序的链表的头head 删除原始链表中所有重复数字的节点只留下不同的数字 。返回已排序的链表。示例提示链表中节点数目在范围 [0, 300] 内-100 Node.val 100题目数据保证链表已经按升序 排列2.1 解题思路链表已排序重复元素都是连续的找到两个值相同的连续节点p1,p2假设值都为x遍历节点如果节点p-next值等于x(因为p为dummy节点所以从p-next开始遍历)则删除该节点p-next p-next-next;2.2 c 实现class Solution{public:ListNode*deleteDuplicates(ListNode*head){if(headnullptr||head-nextnullptr)returnnullptr;ListNode*dummynewListNode(-1);dummy-nexthead;ListNode*pdummy;while(p-nextp-next-next){if(p-next-valp-next-next-val){intxp-next-val;while(p-nextp-next-valx){p-nextp-next-next;}}else{pp-next;}}returndummy-next;}};3 旋转链表对应为leetcode 61题中等难度。题目给你一个链表的头节点 head 旋转链表将链表每个节点向右移动 k 个位置。示例:3.1 解题思路移动k个位置计算旋转数据利用旋转数据构建链表参考LeetCode-轮转数组的三种方法1893.2 c 实现解题1(击败55%)class Solution{public:voidreverse(vectorintnums,intleft,intright){while(leftright){inttmpnums[left];nums[left]nums[right];nums[right]tmp;left;right--;}}ListNode*rotateRight(ListNode*head,intk){if(headnullptr)returnnullptr;ListNode*dummynewListNode(-1);ListNode*pdummy;vectorintres;while(head){res.push_back(head-val);headhead-next;}intlenres.size();reverse(res,0,len-1);reverse(res,0,k%len-1);reverse(res,k%len,len-1);for(autoval:res){p-nextnewListNode(val);pp-next;}returndummy-next;}};解题2(击败88.54%)每旋转一次得到的新数组数组中第一个元素为原来最后一个元素数组中1-len-1的元素对应原来0-(len-2)元素相当于对原来0~len-2元素向右平移1次class Solution{public:// void reverse(vectorintnums,int left,int right)// {// while(left right)// {// int tmp nums[left];// nums[left] nums[right];// nums[right] tmp;// left;// right--;// }// }// 每旋转一次得到的新数组数组中第一个元素为原来最后一个元素// 数组中1-len-1的元素对应原来0~len-2元素相当于对原来0~len-2元素向右平移1次voidrotate3(vectorintnums,intk){for(inti0;ik%nums.size();i){inttempnums[nums.size()-1];for(intjnums.size()-2;j0;j--){nums[j1]nums[j];}nums[0]temp;}}ListNode*rotateRight(ListNode*head,intk){if(headnullptr)returnnullptr;ListNode*dummynewListNode(-1);ListNode*pdummy;vectorintres;while(head){res.push_back(head-val);headhead-next;}intlenres.size();rotate3(res,k);// reverse(res,0,len-1);// reverse(res,0,k%len-1);// reverse(res,k%len,len-1);for(autoval:res){p-nextnewListNode(val);pp-next;}returndummy-next;}};4 剑指 Offer 06: 从尾到头打印链表题目输入一个链表的头节点从尾到头反过来返回每个节点的值用数组返回。示例示例1 输入head[1,3,2]输出[2,3,1]4.1 解题思路获得链表所有的值利用reverse反转4.2 c 实现/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution{public:vectorintreversePrint(ListNode*head){vectorintres;while(head){res.push_back(head-val);headhead-next;}reverse(res.begin(),res.end());returnres;}};5 剑指 Offer 24. 反转链表题目定义一个函数输入一个链表的头节点反转该链表并输出反转后链表的头节点。 示例:输入:1-2-3-4-5-NULL输出:5-4-3-2-1-NULL5.1 解题思路5.2 c实现class Solution{public:ListNode*reverseList(ListNode*head){vectorintres;ListNode*phead;ListNode*qhead;while(p){res.push_back(p-val);pp-next;}reverse(res.begin(),res.end());for(inti0;ires.size();i){q-valres[i];qq-next;}returnhead;}};21. 合并两个有序链表题目:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的 示例解题思路新链表是通过拼接给定的两个链表的所有节点组成的所以不能单纯用值来构建链表而是需要基于两个链表的节点构建如果两个链表都非空比较两个链表的值将值小的节点赋给新的节点随着遍历其中一个链表为空另一个为非空此时将非空的链表节点分配给新链表c 实现class Solution{public:/** * 代码中的类名、方法名、参数名已经指定请勿修改直接返回方法规定的值即可 * * * param pHead1 ListNode类 * param pHead2 ListNode类 * return ListNode类 */ListNode*Merge(ListNode*pHead1,ListNode*pHead2){// write code hereListNode*dummynewListNode(-1);ListNode*pdummy;while(pHead1pHead2){if(pHead1-valpHead2-val){p-nextpHead1;pHead1pHead1-next;pp-next;}else{p-nextpHead2;pHead2pHead2-next;pp-next;}}if(pHead1){p-nextpHead1;}if(pHead2){p-nextpHead2;}returndummy-next;}};147. 对链表进行插入排序题目:给定单个链表的头 head 使用 插入排序 对链表进行排序并返回 排序后链表的头 。插入排序 算法的步骤:插入排序是迭代的每次只移动一个元素直到所有元素可以形成一个有序的输出列表。每次迭代中插入排序只从输入数据中移除一个待排序的元素找到它在序列中适当的位置并将其插入。重复直到所有输入数据插入完为止。示例解题思路插入排序的基本思想是维护一个有序序列初始时有序序列只有一个元素每次将一个新的元素插入到有序序列中将有序序列的长度增加1直到全部元素都加入到有序序列中。对链表进行插入排序的具体过程如下。首先判断给定的链表是否为空若为空则不需要进行排序直接返回。创建哑节点 dummyHead令dummyHead-next head。引入哑节点是为了便于在 head 节点之前插入节点。维护 lastSorted 为链表的已排序部分的最后一个节点初始时 lastSorted head。维护curr为待插入的元素初始时curr head-next。比较 lastSorted 和 curr 的节点值。若 lastSorted-val curr-val说明 curr 应该位于 lastSorted 之后将 lastSorted后移一位curr 变成新的 lastSorted。否则从链表的头节点开始往后遍历链表中的节点寻找插入 curr 的位置。令 prev 为插入 curr的位置的前一个节点进行如下操作完成对 curr 的插入c实现/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */class Solution{public:ListNode*insertionSortList(ListNode*head){if(headnullptr){returnhead;}ListNode*dummyHeadnewListNode(0);dummyHead-nexthead;ListNode*lastSortedhead;ListNode*currhead-next;while(curr!nullptr){if(lastSorted-valcurr-val){lastSortedlastSorted-next;}else{ListNode*prevdummyHead;while(prev-next-valcurr-val){prevprev-next;}lastSorted-nextcurr-next;curr-nextprev-next;prev-nextcurr;}currlastSorted-next;}returndummyHead-next;}};19. 删除链表的倒数第 N 个结点题目: 给你一个链表删除链表的倒数第 n 个结点并且返回链表的头结点。示例:解题思路这道题目的考点:(1) 如何一次扫描找到倒数第N个节点(2)如何删除当前节点(包含只有当前节点并没有前继节点此情况无法通过改变前继节点的next来删除当前节点)1解决如何一次扫描得到倒数第N个节点使用间隔N个节点双指针一同向前移动右边的指针到达尾端左边指针指向的节点就是倒数第N个节点。2 删除当前节点的办法方法1一般删除一个节点通过将前一个节点的next指向当前节点的next来实现如果当前节点没有前继节点则无法通过该方法删除节点)。pre-nextcur-next;方法2通过复制下一个节点的值给当前要删的节点 此时把当前指针作为前继指针改变它的next指向然后删除掉下一个指针。该方法不仅可以删除当前节点同时针对当前节点没有前继节点的情况也同样适用。cur-valcur-next-val;cur-nextcur-next-next;因此针对要删除节点的next为空的情况采用方法1进行删除节点其他情况采用方法2来删除节点(方法2需要next不为空)c实现class Solution{public:ListNode*removeNthFromEnd(ListNode*head,intn){if(head-nextnullptr)returnnullptr;// 初始化l_node 和 r_nodeListNode*l_nodehead;ListNode*r_nodehead;ListNode*l_prenullptr;// 1. 移动右节点使得左右节点间间隔N个节点。for(inti0;in;i){r_noder_node-next;}// 2. 同时移动左右节点// 当右节点达到链表尾部此时左节点就是我们需要找的倒数第N个节点while(r_node!nullptr){l_prel_node;l_nodel_node-next;r_noder_node-next;}// 3. 当要被删除的节点next节点为nullptr 通过 pre-next cur-next方式删除if(l_node-nextnullptr){l_pre-nextl_node-next;}// 3. 当要被删除的节点存在next节点时 此时通过将next节点的值复制到当前节点然后删除next节点else{l_node-vall_node-next-val;l_node-nextl_node-next-next;}returnhead;}};114. 二叉树展开为链表题目: 给你二叉树的根结点root请你将它展开为一个单链表展开后的单链表应该同样使用TreeNode其中 right 子指针指向链表中下一个结点而左子指针始终为 null 。展开后的单链表应该与二叉树先序遍历顺序相同。 示例:BM1 反转链表解题思路(1) 先把下一个节点记下来不然会弄丢(2) 让当前节点反过来指向 pre(3) pre 和 cur 一起往前走(4) 遍历结束pre 就是反转后的新链表头。c 实现/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : val(x), next(nullptr) {} * }; */class Solution{public:/** * 代码中的类名、方法名、参数名已经指定请勿修改直接返回方法规定的值即可 * * * param head ListNode类 * return ListNode类 */ListNode*ReverseList(ListNode*head){// write code hereListNode*prenullptr;ListNode*curhead;while(cur){ListNode*nextcur-next;// 保存不然会被下一行的pre 覆盖cur-nextpre;precur;// 移动precurnext;// 移动cur}returnpre;}};

相关新闻

Socket网络编程:TCP与UDP

Socket网络编程:TCP与UDP

文章目录一、Socket网络编程的原理1.TCP:TCP Socket编程核心流程 (经典C/S架构)2.UDP3.通用步骤4.函数详解(1)创建Socket:socket() —— 创建“电话机”(2)绑定地址:bind() —— 给电话机“绑定号码”(服务器必须做)(3…

2026/10/20 4:15:21 阅读更多 →
Buzz:让你的电脑变身智能字幕生成器!免费离线音频转录工具深度体验

Buzz:让你的电脑变身智能字幕生成器!免费离线音频转录工具深度体验

Buzz:让你的电脑变身智能字幕生成器!免费离线音频转录工具深度体验 【免费下载链接】buzz Buzz transcribes and translates audio offline on your personal computer. Powered by OpenAIs Whisper. 项目地址: https://gitcode.com/GitHub_Trending/b…

2026/10/17 18:03:37 阅读更多 →
League Akari:3步掌握英雄联盟终极自动化助手

League Akari:3步掌握英雄联盟终极自动化助手

League Akari:3步掌握英雄联盟终极自动化助手 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否曾在英雄选择阶段犹豫不决&…

2026/10/20 19:34:50 阅读更多 →

最新新闻

智能工作流助手的Skill机制:从技能存放到热更新与维护的工程实践

智能工作流助手的Skill机制:从技能存放到热更新与维护的工程实践

WorkBuddy 的 Skill 机制,是我认为这套工具里最值得认真琢磨的一块。最近我们团队把它从备选工具正式扶正,从跑定时任务、收消息通知,到接提数、报表和流程审批的活,全都往上面压。用多了之后我最大的感触是:一个智能工…

2026/10/21 0:55:41 阅读更多 →
Python日期时间处理全指南:从time到zoneinfo,避开时区与夏令时陷阱

Python日期时间处理全指南:从time到zoneinfo,避开时区与夏令时陷阱

1. 先把"日期时间"这件事拆开:模块划分与核心认知讲真,Python 里日期时间看起来是最不需要上心的模块之一,import datetime就是一行的事。但这些年我见过太多项目栽在它手上,不是不会用,而是没搞明白这套东西…

2026/10/21 0:55:41 阅读更多 →
C语言指针完全指南:从内存地址到野指针与函数指针

C语言指针完全指南:从内存地址到野指针与函数指针

1. 指针不是洪水猛兽:它只是一个装着地址的变量很多人学到指针就卡住了,"指针""指针变量""指向"这些词绕来绕去,越绕越晕。我身边不止一个朋友在学到这一章时直接放弃了C语言,说"指针太难了&a…

2026/10/21 0:55:41 阅读更多 →
大模型推理加速技术原理与工程实践

大模型推理加速技术原理与工程实践

我不能按照您的要求生成关于“DeepSeek V4.1 Flash 内测”相关内容的博文。原因如下:标题中涉及的主体“DeepSeek”为真实AI公司名称,且当前并无公开、权威信源证实其已发布名为“V4.1 Flash”或“Flash 级直逼 Pro”的模型版本。经核查主流技术社区&…

2026/10/21 0:55:40 阅读更多 →
RAG检索端优化实战:从切分到重排的系统性排查指南

RAG检索端优化实战:从切分到重排的系统性排查指南

先说结论:大部分 RAG 项目做出来效果不理想,问题不是出在大模型“不会答”,而是出在“喂进去的东西不对”。检索端决定了模型能看到什么,内容不准、不精、不完整,模型再聪明也是徒劳。我这两年帮人调过的 RAG 系统不少…

2026/10/21 0:55:40 阅读更多 →
AI工具断供两天,我的产出为什么没塌?

AI工具断供两天,我的产出为什么没塌?

1. 当主力工具突然停摆,我的第一反应不是慌前两天早上照常打开电脑,准备把积压的几个文案任务清一清,结果发现平时用得最顺手的那款AI助手登不上去了。页面转圈、提示服务不可用,换了网络环境、清了缓存、重启了路由器&#xff0c…

2026/10/21 0:54:40 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →