[Algorithm][链表][两数相加][两两交换链表中的节点][重排链表][合并K个升序链表][K个一组翻转链表] + 链表原理 详细讲解

目录

  • 0.常用技巧
  • 1.两数相加
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 2.两两交换链表中的节点
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 3.重排链表
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 4.合并 K 个升序链表
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 5.K 个一组翻转链表
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现


0.常用技巧

  • 画图 -> 直观 + 形象 -> 便于理解

  • 引入虚拟头结点

    • 便于处理边界情况
    • 方便对链表操作
  • 不要吝啬空间,大胆去定义变量

    • 简化插入删除的逻辑
    • 都是函数内的临时变量,也不会很占用空间:P
      请添加图片描述
  • 快慢双指针

    • 判环
    • 找链表中环的入口
    • 找链表中倒数第n个结点

1.两数相加

1.题目链接

  • 两数相加

2.算法原理详解

  • 两个链表都是逆序存储数字的
    • 即:两个链表的个位数、⼗位数等都已经对应,可以直接相加
  • 在相加过程中,要注意是否产⽣进位,产⽣进位时需要将进位和链表数字⼀同相加
    • 如果产⽣进位的位置在链表尾部,即答案位数⽐原链表位数⻓⼀位,还需要再new⼀个结点储存最⾼位

3.代码实现

ListNode* AddTwoNumbers(ListNode* l1, ListNode* l2) 
{ListNode* head = new ListNode(0);ListNode* cur1 = l1, *cur2 = l2;ListNode* tail = head; // 尾指针int carry = 0; // 记录进位 & 临时数据while(cur1 || cur2 || carry){if(cur1){carry += cur1->val;cur1 = cur1->next;}if(cur2){carry += cur2->val;cur2 = cur2->next;}tail->next = new ListNode(carry % 10);tail = tail->next;carry /= 10;}ListNode* ret = head->next;delete head;return ret;
}

2.两两交换链表中的节点

1.题目链接

  • 两两交换链表中的节点

2.算法原理详解

请添加图片描述


3.代码实现

ListNode* SwapPairs(ListNode* list) 
{// 边界处理if(list == nullptr || list->next == nullptr){return list;}ListNode *head = new ListNode(0);head->next = list;ListNode *prev = head, *cur = head->next, *next = cur->next, *nNext = next->next;while(cur && next){// Swapprev->next = next;next->next = cur;cur->next = nNext;// Updateprev = cur;cur = nNext; if(cur){next = cur->next;}if(next){nNext = next->next;}}ListNode *ret = head->next;delete head;return ret;
}

3.重排链表

1.题目链接

  • 重排链表

2.算法原理详解

  • 找到链表的中间结点
    • 快慢双指针
  • 把后面部分逆序
    • 头插法
  • 合并两个链表
    • 双指针
      请添加图片描述

3.代码实现

void ReorderList(ListNode* head) 
{// 边界处理if(!(head || head->next || head->next->next)){return;}// 1.找到链表的中间结点 -> 快慢指针ListNode *slow = head, *fast = head;while(fast && fast->next) // 偶 && 奇{slow = slow->next;fast = fast->next->next;}// 2.逆序后半部分 -> 头插ListNode *head2 = new ListNode(0);ListNode *cur = slow->next;slow->next = nullptr; // 断开两个链表while(cur){ListNode *next = cur->next;cur->next = head2->next;head2->next = cur;cur = next;}// 3.合并两个链表 -> 尾插 -> 双指针ListNode *ret = new ListNode(0);ListNode *tail = ret;ListNode *cur1 = head, *cur2 = head2->next;while(cur1){// 先连第一个链表tail->next = cur1;tail = tail->next;cur1 = cur1->next;// 再连第二个链表if(cur2){tail->next = cur2;tail = tail->next;cur2 = cur2->next;}}delete head2;delete ret;
}

4.合并 K 个升序链表

1.题目链接

  • 合并 K 个升序链表

2.算法原理详解

  • 思路一:利用
    • 合并K个升序链表时,可以选择K个链表中,头结点值最⼩的那⼀个
    • 那么如何快速的得到头结点最⼩的是哪⼀个呢?
      • 小根堆
    • 可以把所有的头结点放进⼀个⼩根堆中,这样就能快速的找到每次K个链表中,最⼩的元素是哪个
  • 思路二:递归/分治
    请添加图片描述

3.代码实现

// v1.0 Heap
class Solution 
{struct Cmp{bool operator()(const ListNode* l1, const ListNode* l2){return l1->val > l2->val;}};
public:ListNode* mergeKLists(vector<ListNode*>& lists) {// 创建一个小根堆priority_queue<ListNode*, vector<ListNode*>, Cmp> heap;// 让所有头结点入堆for(auto& list : lists){if(list){heap.push(list);}}// 合并K个有序链表ListNode* ret = new ListNode(0);ListNode* tail = ret;while(!heap.empty()){ListNode* tmp = heap.top();heap.pop();tail->next = tmp;tail = tail->next;if(tmp->next){heap.push(tmp->next);}}tail = ret->next;delete ret;return tail;}
};// v2.0 递归
class Solution 
{
public:ListNode* mergeKLists(vector<ListNode*>& lists) {return Merge(lists, 0, lists.size() - 1);}ListNode* Merge(vector<ListNode*>& lists, int left, int right){// 边界情况处理if(left > right){return nullptr;}if(left == right){return lists[left];}// 中间点划分数组int mid = left + (right - left) / 2;// [left, mid] [mid + 1, right]// 递归处理左右区间ListNode* l1 = Merge(lists, left, mid);ListNode* l2 = Merge(lists, mid + 1, right);// 合并两个有序链表return MergeTwoLists(l1, l2);}ListNode* MergeTwoLists(ListNode* l1, ListNode* l2){// 边界情况处理if(l1 == nullptr){return l2;}if(l2 == nullptr){return l1;}// 合并两有序链表ListNode head(0);ListNode *cur1 = l1, *cur2 = l2, *tail = &head;while(cur1 && cur2){if(cur1->val <= cur2->val){tail->next = cur1;tail = tail->next;cur1 = cur1->next;}else{tail->next = cur2;tail = tail->next;cur2 = cur2->next;}}if(cur1){tail->next = cur1;}if(cur2){tail->next = cur2;}return head.next;}
};

5.K 个一组翻转链表

1.题目链接

  • K 个一组翻转链表

2.算法原理详解

  • 思路
    • 按k个一组,分出需要逆序多少组
      • 遍历链表求出n
      • n /= 3
    • 重复n次,长度为k的链表逆序即可

3.代码实现

ListNode* ReverseKGroup(ListNode* head, int k) 
{// 遍历求nint n = 0;ListNode* cur = head;while(cur){n++;cur = cur->next;}n /= k;// 重复n次逆序长度为k的链表 -> 头插ListNode ret(0);ListNode *prev = &ret;cur = head;while(n--){ListNode *back = cur;for(int i = 0; i < k; i++){ListNode* next = cur->next;cur->next = prev->next;prev->next = cur;cur = next;}prev = back; // 更次每次头插的"头"}// 链接剩下的结点prev->next = cur;return ret.next;
}

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

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

相关文章

蓝网科技临床浏览系统 deleteStudy SQL注入漏洞复现(CVE-2024-4257)

0x01 产品简介 蓝网科技临床浏览系统是一个专门用于医疗行业的软件系统,主要用于医生、护士和其他医疗专业人员在临床工作中进行信息浏览、查询和管理。 0x02 漏洞概述 蓝网科技临床浏览系统 deleteStudy接口处SQL注入漏洞,未经身份验证的恶意攻击者利用 SQL 注入漏洞获取…

喀秋莎Camtasia2023中文破解Crack下载附安装教程 2023免费补丁百度云 电脑版注册机提取

Camtasia2023破解版是一款备受好评的电脑录屏软件&#xff0c;主要用于教授课程&#xff0c;培训他人&#xff0c;以及进行沟通和屏幕分享。内置视频编辑器支持拖放文本&#xff0c;提供了强大的屏幕录像、视频的剪辑和编辑、视频菜单制作、视频剧场和视频播放功能等&#xff0…

如何编写测试用例

总结 测试用例需求来源 文档 用户角度 编写测试用例步骤 分析需求 写测试点 对需求的拆分 辅助完成测试用例的编写 编写测试用例 编写测试用例原则 能看懂 能执行 测试结果状…

【研发管理】产品经理知识体系-产品创新中的市场调研

导读&#xff1a;在产品创新过程中&#xff0c;市场调研的重要性不言而喻。它不仅是产品创新的起点&#xff0c;也是确保产品成功推向市场的关键步骤。对于产品经理系统学习和掌握产品创新中的市场调研相关知识体系十分重要。 目录 概述&#xff1a;市场调研重要性 1、相关概…

大象机器人开源协作机械臂myCobot 630 全面升级!

1. 开篇概述 在快速发展的机器人技术领域中&#xff0c;Elephant Robotics的myCobot 600已经证明了其在教育、科研和轻工业领域的显著适用性。作为一款具备六自由度的机械臂&#xff0c;myCobot 600以其600mm的工作半径和2kg的末端负载能力&#xff0c;满足了多样化的操作需求。…

人工 VS AGV无人搬运机器人,AGV赋能中国智能制造

agv 机器人作为智能制造的重要抓手&#xff0c;正在渗透到各个传统行业&#xff0c;成为我国制造业转型升级的焦点。未来&#xff0c;智能AGV将不仅仅是简单的把货物搬运到指定的位置&#xff0c;而是要把5G技术、大数据、物联网、云计算等贯穿于产品的设计中&#xff0c;让智能…

【CGALDotNet】二维矢量多边形可视域计算(C#调用CGAL)

参考 CGALDotNet快速开始&#xff1a;https://blog.csdn.net/liqian_ken/article/details/138274933 CGAL二维可视域计算介绍&#xff1a;https://doc.cgal.org/latest/Visibility_2/index.html#visibility_2_introduction CGAL相关接口&#xff1a;https://doc.cgal.org/late…

c#数据库: 6.查询成绩合格的学生/7.输出全部学生信息

SQL Server Management Studio Management Studio 中的学生信息表: 查询上图成绩合格的学生信息&#xff0c;并将信息从控制台输出 using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text…

【设计模式】简单工厂模式(Simple Factory Pattern)

工厂模式&#xff08;Factory Pattern&#xff09; 用于创建不同类型的奖品对象。您可以创建一个奖品工厂&#xff0c;根据配置的类型来实例化相应的奖品对象。 public interface Prize {void award(); }public class MoneyPrize implements Prize {Overridepublic void awar…

基于Sping Boot集成的websocket实现聊天室

Spring Boot整合WebSocket实现聊天室 Spring Boot 提供了 Websocket 组件 spring-boot-starter-websocket&#xff0c;用来支持在 Spring Boot环境下对Websocket 的使用。 下面我们就以多人在线聊天室为例&#xff0c;演示 Spring Boot 是如何整合Websocket 实现服务端消息推…

U盘格式转换GPT格式转回DOS

当前格式 fdisk /dev/sdb# 在 fdisk 提示符下&#xff0c;输入以下命令删除分区&#xff1a; d # 选择要删除的分区编号&#xff08;如 1、2 等&#xff09; w开始转换 [rootnode-24 ~]# fdisk /dev/sdbWelcome to fdisk (util-linux 2.37.4). Changes will remain in memory o…

使用opencv改变图片大小

使用opencv改变图片大小 图片的宽度和高度效果代码 图片的宽度和高度 宽度&#xff1a;图片的宽度指的是图像从左边缘到右边缘的水平跨度。在数字图像中&#xff0c;宽度通常是以像素&#xff08;pixels&#xff09;为单位来度量的。高度&#xff1a;图片的高度指的是图像从上…

推荐一个wordpress免费模板下载

首页大背景图&#xff0c;首屏2张轮播图&#xff0c;轮换展示&#xff0c;效果非常的炫酷&#xff0c;非常的哇噻&#xff0c;使用这个主题搭建的wordpress网站&#xff0c;超过了200个&#xff0c;虽然是一个老主题了&#xff0c;不过是经得起时间考验的&#xff0c;现在用起来…

CUDA架构介绍与设计模式解析

文章目录 **CUDA**架构介绍与设计模式解析**1** CUDA 介绍CUDA发展历程CUDA主要特性CUDA系统架构CUDA应用场景编程语言支持CUDA计算过程线程层次存储层次 **2** CUDA 系统架构分层架构并行计算模式生产-消费者模式工作池模式异步编程模式 **3** CUDA 中的设计模式工厂模式策略模…

MySQL常见问题解决和自动化安装脚本

常见问题 MySQL密码正确但无法登录的情况 这种情况一般都是因为缓存&#xff0c;使用mysql -u root -p123456直到成功登陆为止&#xff0c;并且进入之后重新修改密码&#xff0c;多次重复修改密码的命令并且再一次清除缓存后退出。 ALTER USER rootlocalhost IDENTIFIED WIT…

用什么模型算法可以预测足球胜平负

预测足球胜平负的模型算法有很多种&#xff0c;每种算法都有其特点和适用场景。以下是一些常见的模型算法&#xff1a; Elo预测法&#xff1a; 这是一种通过研究主客场球队在比赛前的积分情况来预测胜负的方法。Elo预测法通过计算两队之间的积分差&#xff0c;根据特定的公式&…

摩根大通推出创新工具 FlowMind,引领金融自动化新变革

近日&#xff0c;摩根大通人工智能研究部推出了一款极具创新性的工具——FlowMind&#xff0c;为金融行业带来了全新的工作模式和效率提升。 FlowMind 能够自动化金融工作流程&#xff0c;在信贷审批、风险评估、合规监测等重要任务中发挥着关键作用。它利用 GPT 自动生成工作…

C++初阶学习第四弹——类与对象(中)——刨析类与对象的核心点

类与对象&#xff08;上&#xff09;&#xff1a;C初阶学习第三弹——类与对象&#xff08;上&#xff09;——初始类与对象-CSDN博客 前言&#xff1a; 在前面文章中&#xff0c;我们已经讲了类与对象的思想和类与对象的一些基本操作&#xff0c;接下来这篇文章我们将讲解以下…

虚拟机网络桥接模式无法通信,获取到的ip为169.254.X.X

原因&#xff1a;VMware自动选择的网卡可能不对 解决&#xff1a;编辑-虚拟网络编辑器-更改桥接模式-选择宿主机物理网卡&#xff0c;断开虚拟机网络连接后重新连接即可

hive使用hplsql进行etl或其它数据加工

参照 https://cwiki.apache.org/confluence/pages/viewpage.action?pageId59690156 http://www.hplsql.org/doc Hive HPL/SQL&#xff0c;即Hive Hybrid Procedural SQL一个开源工具&#xff0c;它为hive实现了过程性的SQL功能&#xff0c;类似Oracle的PLSQL。从hive 2.0.0开…