当前位置: 首页 > news >正文

剑指Offer(数据结构与算法面试题精讲)C++版——day9

剑指Offer(数据结构与算法面试题精讲)C++版——day9

      • 题目一:链表中的数字相加
      • 题目二:重排链表
      • 题目三:回文链表
      • 附录:源码gitee仓库

题目一:链表中的数字相加

在这里插入图片描述
在这里插入图片描述
    这里可以使用模拟两个正整数相加的方式来解决问题。鉴于链表是从高位到低位排序的,这与我们日常从个位开始相加的运算习惯不符,所以需要先对链表进行一次反转操作。将两个链表反转后,设置两个指针,分别指向这两个链表的第一个节点,让它们同时从个位开始相加。在相加过程中,要仔细记录每次相加产生的进位数,因为像 8 + 7 等于 15 这样的情况,就会产生进位 1 并要参与下一位的运算。当两个链表的节点都处理完后,可能仍有进位,此时要特殊处理。由于前面我们进行了链表反转,为了得到最终正确的结果,还需要对得到的数字所构成的链表再进行一次反转操作,通过以上这些步骤即可得到最终答案,具体实现代码如下:

linkList sumLinkList(linkList head1,linkList head2) {
	linkNode *p=head1, *q=head2,*head=nullptr,*next=nullptr;
	int plus=0,data=0;
	bool isFirst=true;
	while(p&&q) {
		data=(p->data+q->data+plus)%10;
		plus=(p->data+q->data+plus)/10;
		linkNode * node=new linkNode(data);
		if(isFirst) {
			head=node;
			next=head;
			isFirst=false;
		} else {
			next->next=node;
			next=node;
		}
		p=p->next;
		q=q->next;
	}
	while(p) {
		data=(p->data+plus)%10;
		plus=(p->data+plus)/10;
		linkNode * node=new linkNode(data);
		if(isFirst) {
			head=node;
			next=head;
			isFirst=false;
		} else {
			next->next=node;
			next=node;
		}
		p=p->next;
	}
	while(q) {
		data=(q->data+plus)%10;
		plus=(q->data+plus)/10;
		linkNode * node=new linkNode(data);
		if(isFirst) {
			head=node;
			next=head;
			isFirst=false;
		} else {
			next->next=node;
			next=node;
		}
		q=q->next;
	}
	if(plus) {
		linkNode * node=new linkNode(plus);
		next->next=node;
		next=node;
	}
	next->next=nullptr;
	head=reverseList(head);
	return head;
}

在这里插入图片描述
    补充说明,为了让代码不至于太长,这里只放核心代码,这里sumLinkList函数的两个参数分别为已经反转的两个链表,至于模拟数据以及输出结果,新开一个公开的资源链接,这样便能够方便大家详细复盘了。

题目二:重排链表

在这里插入图片描述
在这里插入图片描述
    这道重排链表的题目与考研408中出现的链表重排问题比较相似。考研408中的链表重排重点在于奇偶重排列,而本题则要求将链表前半段保持正序,后半段进行逆序处理。
    从实现角度来看,虽然整体思路不算特别复杂,但在操作过程中需要着重注意原链表长度的奇偶性,当原链表长度为偶数时,处理流程相对清晰简单,只需让前半段链表维持原本的顺序不变,后半段链表执行逆序操作,最后将两段链表进行交叉组合,就能达成重排的目的。
    当原链表长度为奇数时,最中间的那个节点要划分到前半段链表中,后续步骤和偶数长度时类似,先对后半段链表进行逆序,再将前后两段链表交叉合并。为了顺利实现这一系列操作,我们可以先对链表进行一次完整遍历,在这个过程中不仅能判断出链表长度的奇偶性,还能精确获取链表的具体长度数值。之后利用快慢指针的方法,先让快指针前进链表长度一半的距离,接着快慢指针同步移动,从而实现链表前后段的划分。划分完成后,对后半段链表进行逆序处理,最后通过交叉合并的操作,就能得到符合题目要求的重排链表结果了,具体的代码实现如下所示:

linkList convertList(linkList head) {
	linkList p=head;
	linkNode *start=head,*end=head,*mark=nullptr,*q=nullptr,*pre=nullptr;
	int count=0,gap=0;
	while(p) {//计算链表长度 
		p=p->next;
		count++;
	}
	gap=count/2;
	while(gap--) {//后半段指针先走gap 
		if(gap==0) {
			mark=end;
		}
		end=end->next;
	}
	if(count%2==0) {//根据就行拆分成两段 
		mark->next=nullptr;
	} else {
		mark=end->next;
		end->next=nullptr;
		end=mark;
	}
	end=reverseList(end);
	p=head,q=end;
	while(q) {//交叉合并 
		mark=p->next;//存储两个链表下次遍历的节点 
		pre=q->next;

		p->next=q;
		q->next=mark;
		p=mark;
		q=pre;
	}
	return head;
}

在这里插入图片描述

题目三:回文链表

在这里插入图片描述
在这里插入图片描述
    这里有一个额外要求,时间复杂度为O(n),并且不能超过O(1)的辅助空间,可以直接使用前面一题的思路,先扫描一次链表,记录链表中含有奇数个节点还是偶数个节点,然后和前面一样使用快慢指针,如果是偶数个那么快指针先走一半,如果是奇数个节点,那么快指针都一半+1个节点,然后快慢指针同时后移,判断是否相同,如果出现了不相同那么不是回文,否则满足回文条件,得到的代码如下:

附录:源码gitee仓库

    考虑到有些算法需要模拟数据,如果全部放进来代码显得过长,不利于聚焦在算法的核心思路上。于是把所有的代码整理到了开源仓库上,如果想要看详细模拟数据,可在开源仓库自取:【凌空暗羽/剑指offer-C++版手写代码】。

    我是【Jerry说前后端】,本系列精心挑选的算法题目全部基于经典的《剑指 Offer(数据结构与算法面试题精讲)》。在如今竞争激烈的技术求职环境下,算法能力已成为前端开发岗位笔试考核的关键要点。通过深入钻研这一系列算法题,大家能够系统地积累算法知识和解题经验。每一道题目的分析与解答过程,都像是一把钥匙,为大家打开一扇通往高效编程思维的大门,帮助大家逐步提升自己在数据结构运用、算法设计与优化等方面的能力。
    无论是即将踏入职场的应届毕业生,还是想要进一步提升自己技术水平的在职开发者,掌握扎实的算法知识都是提升竞争力的有力武器。希望大家能跟随我的步伐,在这个系列中不断学习、不断进步,为即将到来的前端笔试做好充分准备,顺利拿下心仪的工作机会!快来订阅吧,让我们一起开启这段算法学习之旅!

http://www.dtcms.com/a/122531.html

相关文章:

  • 探秘 Svelte+Vite+TS+Melt - UI 框架搭建,开启高效开发
  • Could not resolve com.google.guava:guava:32.1.1-jre.
  • 【设计模式】面向对象开发学习OOPC
  • vue、vue2、vue3
  • mamba学习1
  • 蓝桥杯填空题攻克
  • 【C++】二叉搜索树(二叉查找树、二叉排序树)详解
  • Go 微服务框架 | 路由实现
  • 【BFT帝国】20250409更新PBFT总结
  • idea手动创建resources文件夹
  • checkra1n越狱出现的USB error -10问题解决
  • 面向数据库场景的大模型交互微调数据集
  • Flutter命令行打包打不出ipa报错
  • IDEA 2024 Maven 设置为全局本地仓库,避免新建项目重新配置maven
  • MySQL MVCC 机制详解
  • 大数据 - 1. 概述
  • 第一章初识爬虫
  • 【力扣hot100题】(079)划分字母区间
  • vue3.2 +vxetable4.6 渲染大数据列,出现错乱问题处理方案
  • BabelDOC ,开源的 AI PDF 翻译工具
  • 20250409-大数据-python数据处理平台/接口平台(DFF)
  • 基于cartographer 1.0.0 不使用ros 使用激光雷达数据和IMU数据融合实现的建图
  • Redis的Spring客户端的使用
  • Android系统深度定制:源码级拦截adb install的完整解决方案
  • Windows 11 家庭中文版 安装docker desktop 无法开启自启动问题处理
  • matlab内置的git软件版本管理功能
  • CSS AI 通义灵码 VSCode插件安装与功能详解
  • MySQL学习笔记十四
  • 安徽京准:NTP网络时钟服务器功能及同步模式的介绍
  • oracle将varchar2 转为clob类型存储。 oracle不支持直接使用sql,将 varchar2 到clob的类型转换,需要下面操作