随机链表的复制 排序链表

随机链表的复制

题目

. - 力扣(LeetCode)

思路:

思路:

        ①一个结点一个节点去拷贝,当拷贝了第一个节点的时候,把原节点与拷贝节点连接起来,直接到所有的节点拷贝完毕,这样做的目的是为下一步处理 random 指针做准备

        ② 处理random

        ③处理整个链表,还原原链表,连接复制的链表,返回头结点

详解步骤 :

①一个结点一个节点去拷贝,当拷贝了第一个节点的时候,把原节点与拷贝节点连接起来,直接到所有的节点拷贝完毕,这样做的目的是为下一步处理 random 指针做准备

 ② 处理random,cur需要不断跌代,cur->next 则为 copyLsit(复制出来的结点),观察可以发现,当cur->random->next 即为 copyList->random

③处理整个链表,还原原链表,连接复制的链表,返回头结点

完整代码:

struct Node* copyRandomList(struct Node* head) 
{if(head == NULL) {return NULL;}// 1,复制节点struct Node* cur = head;while(cur) {struct Node* copyNode = (struct Node*)malloc(sizeof(struct Node));if(copyNode == NULL) {return NULL;}copyNode->next = NULL;copyNode->random = NULL;//连接复制的节点struct Node* next = cur->next;copyNode->val = cur->val;cur->next = copyNode;copyNode->next = next;cur = next;}//处理randomcur = head;while(cur) {struct Node* copy = cur->next;struct Node* next = cur->next->next;if(cur->random == NULL) {copy->random = NULL;}else {copy->random = cur->random->next;}cur = next;}//处理整个链表,还原链表,返回复制链表的头节点cur = head;struct Node* copyHead = cur->next; //最后需要返回复杂链表的头while(cur) {struct Node* copy = cur->next;struct Node* next = copy->next;cur->next = next;if(next) copy->next = next->next;cur = next;}return copyHead;
}

排序链表

题目

. - 力扣(LeetCode)

思路

需用到这个题目:合并两个有序链表

在有归并排序的基础写这个题目就会轻松一点,因为这个题目和归并排序的非递归写法有点类似

先回忆一下归并排序的思想,归并排序是把一段无序的数据一个一个递归出去,然后把一个一个数据当成有序的,再合并,合成2个数后有序了,接下来2个合并,合并成4个数有序,再4个4个合并,以此类推,不断合并

①计算链表的个数,用于控制每一层合并的间距

②创建一个虚拟头节点(带哨兵位的头节点),用于记录每组已经完成归并的链表

③分割链表,找每组的左右子链表进行合并有序链表

详细步骤:

①计算链表的个数,用于控制每一层合并的间距

②创建一个虚拟头节点(带哨兵位的头节点),用于记录每组已经完成归并的链表

   当 gap == 1 的时候,表示数据个数是一个,

   我们需要合并 4 2 为一组合并,14    5 、10   15、 3    7    各为一组合并

   创建 prev 指向虚拟头结点,cur 指向真正链表的头

    prev用于记录每组链表中完成了合并有序链表的操作,cur用于找需要合并的子链表

   head1表示左子链表,head2表示右子链表,在找左子链表的过程中,我们知道gap是会变化的,也就是说子链表的节点个数就是gap的值 (最后末尾可能会存在多一个或者少一个的情况,或者右子链表根本没有)

这只是gap == 1的情况下,gap第一次是 1,第二次是 2,第三次是 4,所以控制间距是 gap * = 2

③分割链表,找每组的左右子链表进行合并有序链表 

如图所示:这只是gap == 1的情形,当 gap 不断变化的时候,原理都是一样的(建议自己画图动手理解)

边界的控制

完整代码

struct ListNode* MergerTwoLists(struct ListNode* list1,struct ListNode* list2) {struct ListNode* l1 = list1;struct ListNode* l2 = list2;if(l1 == NULL) return l2;if(l2 == NULL) return l1;struct ListNode* head = NULL, *tail = NULL;head = tail = (struct ListNode*)malloc(sizeof(struct ListNode));while(l1 && l2) {if(l1->val < l2->val) {tail->next = l1;l1 = l1->next;}else {tail->next = l2;l2 = l2->next;}tail = tail->next;}if(l1) {tail->next = l1;}if(l2) {tail->next = l2;}struct ListNode* reallyHead = head->next;free(head);return reallyHead;}
struct ListNode* sortList(struct ListNode* head) 
{//计算排序链表的个数int Length = 0;struct ListNode* node = head;while(node) {++Length;node = node->next;}    //创建虚拟头结点(带哨兵位的头结点)//每组归并都是从头开始,最后用于返回头结点struct ListNode* dummyHead = (struct ListNode*)malloc(sizeof(struct ListNode));if(dummyHead == NULL) return  NULL;dummyHead->next = head;//分割区间for(int gap = 1; gap < Length; gap *= 2) {struct ListNode* prev = dummyHead;struct ListNode* cur = prev->next;//找两个链表的头while(cur) {//找了头还需要确定左子链表的末尾,断开联系,挪动cur的位置,先确定头再确定右子链表的末尾断开联系,保存下一个,让cur不断往后走,归并,//归并完之后让 prev 不断走,合并完不需要合并,cur不断向后走struct ListNode* head1 = cur;for(int i = 1; i < gap && cur->next; ++i)  //左子链表的确定,如果下一个结点为NULL说明到了末尾,没有右子链表{cur = cur->next;}struct ListNode* head2 = cur->next;   // 如果head2 == NULL,不进人下面的for循环cur->next = NULL;  //确定了第一个左子链表//确定右子链表cur = head2;   // cur 跟上for(int i = 1; i < gap && cur && cur->next; ++i )  {cur = cur->next;}   //gap为 1的时候里面的一小部分,断开右子链表的联系struct ListNode* next = NULL;if(cur) {next = cur->next;cur->next = NULL;}//这样两个左右子链表寻找完毕,接下来就需要合并有序链表了struct ListNode* Mergerd = MergerTwoLists(head1,head2);prev->next = Mergerd;while(prev->next)  // prev 找合并之后链表的尾{prev = prev->next;}cur = next; // cur继续更新}}struct ListNode* reallyHead = dummyHead->next;free(dummyHead);return reallyHead;
}

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

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

相关文章

专业技能篇---计算机网络

文章目录 前言计算机网络基础一、网络分层模型 HTTP一、从输入URL到页面显示发生了什么&#xff1f;二、Http的状态码有哪些&#xff1f;三、 HTTP与HTTPS有什么区别&#xff1f;四、URI 和 URL 的区别是什么?五、Cookie和Session有什么区别&#xff1f;六、GET与POST WebSock…

Android自定义View之不得不知道的文件attrs

其中demo_style如下:一般都是放的.9图片&#xff0c;为了方便就放个颜色了 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190820183209784.png?x-oss-processimage/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLm NzZG4ubmV0L3FxXzQyNzYxMz…

面向服务的架构(Service-Oriented Architecture, SOA)

目录 前言1. SOA的基本概念1.1 定义和特点1.2 核心原则 2. SOA的优势与挑战2.1 优势2.2 挑战 3. SOA的实现技术3.1 Web服务3.2 微服务架构3.3 企业服务总线&#xff08;ESB&#xff09; 4. SOA在现代企业中的应用4.1 金融行业4.2 电子商务4.3 政府和公共服务4.4 医疗健康 结语 …

EE trade:炒伦敦金的注意事项及交易指南

在贵金属市场中&#xff0c;伦敦金因其高流动性和全球认可度&#xff0c;成为广大投资者的首选。然而&#xff0c;在炒伦敦金的过程中&#xff0c;投资者需要注意一些关键点。南华金业小编带您一起来看看。 国际黄金报价 一般国际黄金报价会提供三个价格&#xff1a; 买价(B…

LeetCode 1-两数之和

LeetCode第1题 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现…

力扣SQL50 各赛事的用户注册率 分组计数 双排序字段

Problem: 1633. 各赛事的用户注册率 &#x1f468;‍&#x1f3eb; 参考题解 Code select contest_id, ROUND(COUNT(user_id) * 100 / (select count(*) from users),2) as percentage from register group by contest_id order by percentage desc, contest_id asc

vue3自动导入---组件库elements-ui,vuetify以及scss样式的自动导入

自动导入 我们在使用第三方组件库和css样式文件时&#xff0c;都需要进行引入&#xff0c;可以在单个组件内单独引用&#xff0c;也可以在全局引入或一次引入所有组件&#xff1b;但是&#xff0c;一般情况下我们都不会全部引入&#xff0c;这会是打包的结果变大&#xff0c;而…

linux挂载硬盘(解决linux不显示硬盘问题)

目录 1.查看系统有几块硬盘2.查看挂载情况3.格式化硬盘4.创建挂载目录用于挂载硬盘5.将硬盘挂载到指定的挂载目录6.随系统自启动挂载查看配置文件&#xff0c;看是否已经把这条命令加入配置 帮同门解决挂载失败问题记录 参考视频&#xff1a;只要6步&#xff01;Linux系统下挂载…

人工智能在影像组学与放射组学中的最新进展|顶刊速递·24-06-22

小罗碎碎念 本期文献速递的主题——人工智能在影像组学中的最新进展。 小罗一直以来的观点&#xff0c;是把大问题分模块拆解——既然我们想做多模态&#xff0c;那么就先了解单模态的研究套路&#xff0c;再去研究不同模态提取的特征如何融合&#xff0c;搞科研的过程也是管理…

获取泛型,泛型擦除,TypeReference 原理分析

说明 author blog.jellyfishmix.com / JellyfishMIX - githubLICENSE GPL-2.0 获取泛型&#xff0c;泛型擦除 下图中示例代码是一个工具类用于生成 csv 文件&#xff0c;需要拿到数据的类型&#xff0c;使用反射感知数据类型的字段&#xff0c;来填充表字段名。可以看到泛型…

miniconda安装教程以及pip换源【Windows版本】

Anaconda包含内容较多&#xff0c;这边采用miniconda进行安装演示。 下载安装包 官网链接&#xff1a;https://docs.anaconda.com/miniconda/ 蓝奏云加速链接&#xff1a;https://wwt.lanzoue.com/i6ts3225vuef 开始安装 配置conda 在Windows开始菜单中&#xff0c;找到刚安…

graalvm jdk和openjdk

下载地址:https://github.com/graalvm/graalvm-ce-builds/releases 官网: https://www.graalvm.org

VBA学习(18):VBA制作任意工作表均可使用的聚光灯

在需要制作聚光的工作簿&#xff0c;按<ALTF11>组合键&#xff0c;打开VBE编辑器。在右侧[工程资源管理器窗格]选中ThisWorkbook模块&#xff0c;将以下代码复制粘贴到该模块的代码窗口。 Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target …

MLP多层感知器:AI人工智能神经网络的基石

MLP 是指多层感知器&#xff08;Multilayer Perceptron&#xff09;&#xff0c;是一种基础人工神经网络模型&#xff08;ANN&#xff0c;Artificial Neural Network&#xff09;。MLP 的核心是通过深度学习从大量数据中学习特征和模式&#xff0c;并训练参数。通过参数与激活函…

3.XSS-DOM型(基础和进阶)

DOM XSS&#xff08;基础&#xff09; 不与后台服务器产生数据交互,通过前端的dom节点形成的XSS漏洞。 进行测试一下&#xff0c;输入111&#xff0c;会显示what do you see 查看元素代码&#xff0c;看到What do you see 根据前端页面语句进行编写弹窗攻击代码 <a hr…

智慧公厕系统厂家的核心技术与光明源应用案例

随着城市化进程的加快和智慧城市建设的推进&#xff0c;智慧公厕系统在提升公共服务质量和用户体验方面发挥了重要作用。智慧公厕系统厂家的核心技术是确保这一系统高效运转和用户满意度的关键。以下将介绍智慧公厕系统厂家的核心技术&#xff0c;并通过光明源的应用案例展示其…

VB验证密码

在文本框中输入密码&#xff0c;“验证密码”按钮检验输入的是否为“123456”。“清空”按钮清空文本框。“结束”按钮关闭窗体。 Public Class Form1Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.ClickDim P$P Trim(TextBox1.Text)If P &…

【滚动哈希 二分查找】1044. 最长重复子串

本文涉及知识点 滚动哈希 二分查找算法合集 LeetCode 1044. 最长重复子串 给你一个字符串 s &#xff0c;考虑其所有 重复子串 &#xff1a;即 s 的&#xff08;连续&#xff09;子串&#xff0c;在 s 中出现 2 次或更多次。这些出现之间可能存在重叠。 返回 任意一个 可能具…

基于SSM+Jsp的体育竞赛成绩管理系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

NetSuite Non-Inventory Item 公司内外采购总账影响

上篇文章提到&#xff0c;Non-Inventory Item的科目维护会根据各个企业的实际情况而有所不同&#xff0c;通常情况下都涉及外部交易&#xff0c;即对外采购与销售&#xff1b;另外也涉及到公司内部的相关交易&#xff0c;本篇以采购为例&#xff0c;来看看公司内外采购交易所对…