数据结构(5)单链表算法题(中)

一、合并两个有序链表

1、题目描述 

https://leetcode.cn/problems/merge-two-sorted-lists

 2、算法分析

这道题和之前的合并两个有序数组的思路很像,创建空链表即可,可以很轻松地写出如下代码。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) 
{if(list1 == NULL){return list2;}if(list2 == NULL){return list1;}//创建空链表ListNode* newHead = NULL;ListNode* newTail = NULL;ListNode* l1 = list1;ListNode* l2 = list2;while(l1 && l2){if(l1->val >= l2->val){//l2尾插到新链表中if(newHead == NULL){newHead = newTail = l2;}else{//链表非空newTail->next = l2;newTail = newTail->next;}l2 = l2->next;}else{//l1尾插到新链表中if(newHead == NULL){newHead = newTail = l1;}else{newTail->next = l1;newTail = newTail->next;}l1 = l1->next;}}//要么l1为空,要么l2为空if(l1)newTail->next = l1;if(l2)newTail->next = l2;return newHead;
}

虽然这个代码可以运行通过,但有个很严重的问题——太过冗余!虽然我们可以将尾插的代码封装成函数来解决,但是这里我提供一个更好的方法。导致代码冗余的根本原因就在于我们创建的是一个空的新链表,因此要进行if…else…语句判断,那我直接一开始向系统申请一块空间,创建新的非空的链表不就可以了。至于新的非空链表的val值是什么,我们不用在乎,因为这个非空链表起的是一个占位置的作用(在后续的链表学习中,这种起到占位置作用的节点,我们称之为“哨兵位”)。所有节点按题目要求尾插完成后,新链表就是如下图所示的样子:

这里要注意,我们此时不能返回newHead,而是应该返回newHead的下一个节点才对。并且我们向系统申请的空间在结束后也要释放(虽然在OJ平台上是否释放不会影响整体程序,但还是要养成好习惯~)

3、参考代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) 
{if(list1 == NULL){return list2;}if(list2 == NULL){return list1;}//创建非空链表ListNode* newHead, *newTail;newHead = newTail = (ListNode*)malloc(sizeof(ListNode));ListNode* l1 = list1;ListNode* l2 = list2;while(l1 && l2){if(l1->val >= l2->val){//l2尾插到新链表中newTail->next = l2;newTail = newTail->next;l2 = l2->next;}else{//l1尾插到新链表中newTail->next = l1;newTail = newTail->next;l1 = l1->next;}}//要么l1为空,要么l2为空if(l1){newTail->next = l1;}if(l2){newTail->next = l2;}ListNode* retHead = newHead->next;free(newHead);newHead = NULL;return retHead;
}

二、链表的回文结构

1、题目描述

https://www.nowcoder.com/share/jump/1753713495724

2、算法分析 

提到回文结构,我们会很自然地想到去定义两个指针,一个指向头,一个指向尾,比较两个值是否相等,再让头指针往后走,尾指针往前走。但这道题是一个单向链表,尾指针没有办法往前走。所以这个方法不太行。那我们又想到,找到中间位置,从中间位置向两边走,但是同理还是不行。既然在链表中我们无法判断是否回文,那我们创建一个新数组,把链表的值遍历到新数组中,在数组中判断回文结构不就可以了吗?这里注意,题目中明确指出空间复杂度为O(1),因此这里我们创建一个定长数组arr[900]即可。(题目说了保证链表长度小于等于900)

根据上述思路,给出参考代码如下:

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList 
{
public:bool chkPalindrome(ListNode* A) {//创建数组int arr[900] = {0};//遍历链表,将链表中的值保存在数组中ListNode* pcur = A;int i = 0;while(pcur){arr[i] = pcur->val;i++;pcur = pcur->next;}//判断数组是否为回文结构int left = 0;int right = i - 1;while(left < right){if(arr[left] != arr[right]){return false;}left++;right--;}return true;}
};

但是这个方法毕竟是应试,有点“投机取巧”,所以这里给出更严谨、更合理的方法。

思路2:找链表的中间结点,将中间节点作为新的链表的头结点进行反转链表。

3、参考代码

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public://找中间节点ListNode* middleNode(ListNode* head){ListNode* slow, *fast;slow = fast = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;}return slow;}//反转链表ListNode* reverseList(ListNode* head){if(head == nullptr){return head;}ListNode* n1, *n2, *n3;n1 = nullptr;n2 = head;n3 = n2->next;while(n2){n2->next = n1;n1 = n2;n2 = n3;if(n3){n3 = n3->next;}}return n1;}bool chkPalindrome(ListNode* A) {//找中间节点ListNode* mid = middleNode(A);//反转中间节点之后的链表ListNode* right = reverseList(mid);//遍历原链表和反转之后的链表ListNode* left = A;while(right){if(left->val != right->val){return false;}left = left->next;right = right->next;}return true;}
};

三、相交链表 

1、题目描述

https://leetcode.cn/problems/intersection-of-two-linked-lists

 

2、算法分析 

思路:求两个链表的长度并计算长度差,长链表先走长度差步,然后两个链表同时往后遍历。

3、参考代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode ListNode;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{//求两个链表的长度ListNode* pa = headA;ListNode* pb = headB;int sizeA = 0, sizeB = 0;while(pa){sizeA++;pa = pa->next;}while(pb){sizeB++;pb = pb->next;}//计算长度差int gap = abs(sizeA - sizeB);//abs函数:用于求绝对值//让长链表先走gap步ListNode* shortList = headA;ListNode* longList = headB;if(sizeA > sizeB){longList = headA;shortList = headB;}while(gap--){longList = longList->next;}//longList和shortList在同一起跑线while(shortList){if(longList == shortList){return longList;}shortList = shortList->next;longList = longList->next;}return NULL;
}

 

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

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

相关文章

园区网络搭建实验

跟着B站上的老师&#xff0c;用华为ensp模拟搭建了一个园区网络&#xff0c;感觉挺好玩的虽然老师说这个很简单&#xff0c;但还是比我公司里的拓扑复杂LSW3配置上行端口3/4配置为串口&#xff0c;下行端口1/2为access口用于连接终端[Huawei]vlan batch 10 20 --创建vlan [Hua…

【tips】小程序css ➕号样式

上传的时候一般页面显示的是加号。不用图片可以用样式实现&#xff1b;wxss&#xff1a; /* 加号 */ .plus-box {width: 91rpx;height: 91rpx;border-radius: 6rpx;background: rgba(204, 204, 204, 1);position: relative; /* 用于定位加号 */ }/* 水平线条 */ .plus-box::bef…

MCU中的GPIO(通用输入/输出)是什么?

MCU中的GPIO(通用输入/输出)是什么? GPIO(General-Purpose Input/Output,通用输入/输出)是微控制器(MCU)或嵌入式系统中的一种可编程数字接口,用于与外部设备进行简单的高低电平信号交互。它是最基础、最常用的外设之一,广泛应用于按键检测、LED控制、传感器通信等场…

echarts 之 datazoom Y轴缩放

如果想 y 轴也能够缩放&#xff0c;那么在 y 轴上也加上 dataZoom 组件const dataZoomY ref([{type: "slider",yAxisIndex: 0,startValue: 0,endValue: 9,filterMode: "empty",width: 10,height: "80%",showDataShadow: false,left: 5,},{type:…

(四)Python基础入门-核心数据结构

概览 列表操作&#xff08;增删改查/切片/推导式&#xff09;元组特性与不可变性字典操作&#xff08;键值对/嵌套字典&#xff09;集合运算&#xff08;交集/并集/差集&#xff09; Python的核心数据结构是编程的基石&#xff0c;本文将系统讲解列表、元组、字典和集合四大数…

FCN语义分割算法原理与实战

FCN语义分割算法原理与实战 本文若有舛误&#xff0c;尚祈诸君不吝斧正&#xff0c;感激不尽。 前提概要&#xff1a;所使用的材料来源 对应视频材料&#xff1a;FCN语义分割 虽然可能比较简单但是奠定了使用卷积神经网络做语义分割任务的基础。 语义分割&#xff1a;输入图片…

堆的理论知识

1 引入1.1 普通二叉树不适合用数组存储的原因普通二叉树的结构是 “不规则” 的 —— 节点的左右孩子可能缺失&#xff0c;且缺失位置无规律。 若用数组存储&#xff08;按 “层次遍历顺序” 分配索引&#xff0c;即根节点放索引 0&#xff0c;根的左孩子放 1、右孩子放 2&…

【python实用小脚本-161】Python Json转Xml:告别手敲标签——一行命令把配置秒变可导入的XML

Python Json转Xml&#xff1a;告别手敲标签——一行命令把配置秒变可导入的XML 关键词&#xff1a;json转xml、零依赖脚本、自动生成标签、小白友好、跨平台故事开场&#xff1a;周五下午&#xff0c;老板又甩来“配置翻译”任务 17:55&#xff0c;你正准备关机&#xff0c;老板…

WisFile(文件整理工具) v1.2.19 免费版

下载&#xff1a;https://pan.quark.cn/s/db99b679229fWisFile是一款免费AI文件管理工具&#xff0c;可以在电脑本地运行。它专注于解决文件命名混乱、归类无序和手动整理耗时的问题。通过AI技术智能识别文件内容&#xff0c;支持批量重命名和智能分类归档功能&#xff0c;可自…

简历美容院:如何把“打杂经历“包装成“核心项目“?

简历美容院&#xff1a;如何把"打杂经历"包装成"核心项目"&#xff1f; 大家好&#xff0c;我是程序员小白条&#xff0c;今天来研究下简历包装的事&#xff0c;小白可以按我的包装流程走&#xff0c;可以分步骤进行包装&#xff0c;具体怎么进行可以看正文…

零基础-动手学深度学习-7.7 稠密连接网络(DenseNet)

ResNet极大地改变了如何参数化深层网络中函数的观点。 稠密连接网络&#xff08;DenseNet&#xff09;在某种程度上是ResNet的逻辑扩展。让我们先从数学上了解一下。 7.7.1. 从ResNet到DenseNet 7.7.2. 稠密块体 DenseNet使用了ResNet改良版的“批量规范化、激活和卷积”架构…

Marin说PCB之POC电路layout设计仿真案例---09

好消息&#xff0c;好消息&#xff0c;小编最爱的国漫凡人修仙传电视剧版本的终于可以看了&#xff0c;小编我推荐一波啊&#xff0c;感兴趣的道友们可以去某酷视频去追剧啊。 好了&#xff0c;咱们言归正传啊。本期的案例是这个月中旬我们组的测试大哥阿永去某田实验室去测试我…

论文阅读--射频电源在半导体领域的应用

《射频电源在半导体领域的应用》 论文信息&#xff1a;左政,冯国楠,李建慧,等.射频电源在半导体领域的应用[J].软件和集成电路,2025,(04):38-43.DOI:10.19609/j.cnki.cn10-1339/tn.2025.04.007. 一、射频电源的定义与分类 1.1 定义射频电源&#xff08;RF Power Supply&#xf…

绿算技术携手昇腾发布高性能全闪硬盘缓存设备,推动AI大模型降本增效

在数字化浪潮席卷全球的今天&#xff0c;人工智能已经成为推动企业创新与发展的重要力量。广东省绿算技术有限公司&#xff08;简称“绿算技术”&#xff09;紧跟时代步伐&#xff0c;基于华为昇腾AI大模型&#xff0c;推出了高性能全闪硬盘缓存设备&#xff0c;致力于为人工智…

HoloLens2系列讲解 - 06 基本操作

一、导入MRTK插件 1. 首先要新建一个项目,打开unity,新建一个project。 2. 导入MRTK包。 3. 点击 Mixed Reality Toolkit > Add to scene and Configure 添加MR场景配置文件。

Linux Vim 编辑器使用指南

Linux Vim 编辑器使用指南一、Vim 简介 Vim&#xff08;Vi IMproved&#xff09;是 Linux/Unix 系统中最流行的文本编辑器之一&#xff0c;它是 Vi 的增强版&#xff0c;支持多模式操作、语法高亮、插件扩展等特性&#xff0c;无需鼠标即可高效编辑文本。 二、核心工作模式 Vim…

运维笔记:破解 VMware 迁移难题

一、VMware 迁移前的准备与评估1.1 迁移场景与目标分析VMware 迁移常见场景包括&#xff1a;同平台升级&#xff1a;从 vSphere 6.7 迁移到 7.0/8.0&#xff08;硬件兼容、功能迭代&#xff09;跨平台迁移&#xff1a;VMware→KVM/Xen&#xff08;降低 licensing 成本&#xff…

cartographer 点云数据的预处理

目录 传感器数据的走向 体素滤波与之后的处理 3D情况下的激光雷达数据的预处理 初始位姿估计 位姿推测器的优缺点分析与总结 可能有问题的点 可能的改进建议 传感器数据的走向 传感器数据从CollatedTrajectoryBuilder类的HandleCollatedSensorData函数 传递GlobalTrajec…

基于数据挖掘的短视频点赞影响因素分析【LightGBM、XGBoost、随机森林、smote】

文章目录有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍总结每文一语有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 项目介绍 随着短视频行业的高速发展&#xff0c;尤其是以抖音为代表的平台不断壮大&…

Git 从入门到精通

Git 从入门到精通 涵盖了核心概念、常用命令、协作流程和高级技巧&#xff1a; 核心理念&#xff1a; 版本控制&#xff1a; 记录文件变化历史&#xff0c;可回溯到任意版本。分布式&#xff1a; 每个开发者拥有完整的仓库副本&#xff08;包括完整历史&#xff09;&#xf…