【Leetcode -234.回文链表 -160.相交链表】

news2024/12/24 3:20:02

Leetcode

  • Leetcode -234.回文链表
  • Leetcode -160.相交链表

Leetcode -234.回文链表

题目:给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。

示例 1:
输入:head = [1, 2, 2, 1]
输出:true

示例 2:
输入:head = [1, 2]
输出:false

提示:
链表中节点数目在范围[1, 10^5] 内
0 <= Node.val <= 9

我们的思路是,把链表分为两个部分,以中间的结点为分界线,分为前半部分和后半部分,如果有两个中间结点,以第一个中间结点为标准;以1->2->2->1->NULL为例,如图:

在这里插入图片描述

然后反转以mid为中间结点的后半部分的链表,即反转以mid->next为头的链表;如下图:

在这里插入图片描述

反转完成的链表:

在这里插入图片描述

注意反转过程中改变了链表的结构,应该在返回前把反转的部分反转回来;下面看代码以及注释:

		//找到链表前半部分的函数
		struct ListNode* SLFindMid(struct ListNode* head)
		{
		    struct ListNode* slow = head, * fast = head;
		    while (fast->next && fast->next->next)
		    {
		        slow = slow->next;
		        fast = fast->next->next;
		    }
		    return slow;
		}
		
		//反转链表的函数
		struct ListNode* SLReverse(struct ListNode* head)
		{
		    struct ListNode* curr = head, * prev = NULL;
		    while (curr)
		    {
		        struct ListNode* next = curr->next;
		        curr->next = prev;
		        prev = curr;
		        curr = next;
		    }
		    return prev;
		}
		
		bool isPalindrome(struct ListNode* head)
		{
		    //通过SLFindMid函数找到链表的前半部分,返回的是前半部分的尾指针
		    //SLReverse函数反转后半部分的链表
		    struct ListNode* mid = SLFindMid(head);
		    struct ListNode* reverse = SLReverse(mid->next);
		
		    //p1从头开始,p2从反转后后半部分链表的头开始
		    struct ListNode* p1 = head;
		    struct ListNode* p2 = reverse;
		
		    //p1和p2通过迭代比较,当p2不为空则继续比较,p2为空说明前半部分和后半部分比较完了
		    while (p2)
		    {
		        if (p1->val == p2->val)
		        {
		            p1 = p1->next;
		            p2 = p2->next;
		        }
		
		        //如果比较途中遇到不相等,返回false
		        else
		        {
		        	//把反转的后半部分反转回来,保持链表为原来的结构
		        	SLReverse(reverse);
		            return false;
		        }
		    }
		
		    //最后把反转的后半部分反转回来,保持链表为原来的结构
		    SLReverse(reverse);
		    return true;
		}

Leetcode -160.相交链表

题目:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。
如果两个链表不存在相交节点,返回 null 。

我们的思路是,分别计算两个链表的长度,再计算它们的差值gap,然后让长的那一个链表先走gap步,使它们从长度相同的结点出发比较;

		struct ListNode* getIntersectionNode(struct ListNode* headA, struct ListNode* headB)
		{
		    //从头遍历两个链表,计算它们的长度
		    struct ListNode* tailA = headA, * tailB = headB;
		    int lenA = 0, lenB = 0;
		    while (tailA)
		    {
		        lenA++;
		        tailA = tailA->next;
		    }
		    while (tailB)
		    {
		        lenB++;
		        tailB = tailB->next;
		    }
		
		    //gap计算它们的差值,abs为取绝对值
		    int gap = abs(lenA - lenB);
		
		    //假设A链表为长的那一个链表,B为短的链表
		    struct ListNode* longlist = headA, * shortlist = headB;
		
		    //判断A和B谁是比较长的链表
		    if (lenA < lenB)
		    {
		        longlist = headB;
		        shortlist = headA;
		    }
		
		    //让长的链表先走gap步
		    while (gap--)
		    {
		        longlist = longlist->next;
		    }
		
		    //两个链表从长度相同的结点出发比较
		    while (longlist != shortlist)
		    {
		        longlist = longlist->next;
		        shortlist = shortlist->next;
		    }
		
		    return longlist;
		}

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

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

相关文章

上新了丨高性价比5G智能模组,美格智能SRM700正式发布

伴随着5G、AI、云计算等技术与物联网技术的融合发展&#xff0c;一个万物智联的智能世界正在到来。5G已经成为数字经济重要的基础设施&#xff0c;千行百业的用户都需要依靠高速率、大带宽、低延时的5G技术来构建数字化转型能力。 作为全球领先的无线通信模组及解决方案提供商…

跳槽必备,全面总结Android面试知识点

在最近的 Android 开发&#xff08;社招&#xff09;面试中总结的 Android 基础知识点&#xff0c;已经拿到心仪的offer&#xff0c;回馈同学们&#xff0c;感谢其他大佬的分享。 Android中大厂面试都很重视基础知识的考察&#xff0c;面试前不仅要熟悉这些知识点&#xff0c;…

射频封装技术:层压基板和无源器件集成

射频和无线产品领域可以使用非常广泛的封装载体技术&#xff0c;它们包括引线框架、层压基板、低温共烧陶瓷&#xff08;LTCC&#xff09;和硅底板载体&#xff08;Si Backplane&#xff09;。由于不断增加的功能对集成度有了更高要求&#xff0c;市场对系统级封装方法&#xf…

精进云原生 - Dubbo 3.2 正式发布

作者&#xff1a;Dubbo 社区 我们非常高兴地宣布&#xff0c;Dubbo 3.2 已经正式发布了&#xff01;这个版本带来了许多新功能和改进&#xff0c;这也是 Dubbo 在面对云原生化的当下的一次重要的尝试。 背景介绍 Apache Dubbo 是一款 RPC 服务开发框架&#xff0c;用于解决微…

nodejs+vue 蛋糕甜品商城系统

根据蛋糕甜品商城系统的功能需求&#xff0c;进行系统设计。 系统功能&#xff1a;用户进入系统可以对首页、商品信息&#xff0c;公告信息&#xff0c;个人中心、购物车&#xff0c;客服中心等功能进行操作&#xff1b; 后台主要是管理员&#xff0c;管理员功能包括个人中心、…

大学生用什么蓝牙耳机好?2023好用的蓝牙耳机推荐

近几年&#xff0c;蓝牙耳机市场不断扩大&#xff0c;逐渐取代有线耳机成为最受人欢迎的数码产品之一。作为蓝牙耳机主要受众群的大学生&#xff0c;用什么蓝牙耳机比较好呢&#xff1f;下面&#xff0c;我来给大家推荐几款便宜好用的蓝牙耳机&#xff0c;一起来看看吧。 一、…

apple pencil必须要买吗?高性价比电容笔排行榜

可能很多人都觉得苹果的原装电容笔是无可替代的&#xff0c;但在我看来&#xff0c;这是要看我们的预算和需要了。如果你对绘画的要求不是很高&#xff0c;你可以选择平替电容笔&#xff0c;而并非Apple Pencil&#xff0c;因为它的价格非常昂贵。为了让大家对电容笔有更深的了…

KeePass搭建一个私人密码库

本文转载于我的博客KeePass搭建一个私人密码库 前言 {% note info no-icon %} 既然有人想看那我就不咕了嘻嘻 {% endnote %} 不知道在哪部电影里看到过这样一句话&#xff1a;根据社会工程学&#xff0c;正常人人脑是不会记住超过3种以上完全不同的复杂密码 所以你只要泄露一个…

智慧水务建设的发展与配电设计

摘要&#xff1a;目前以新技术应用带动水务信息化技术水平的全面提升&#xff0c;是水务发展的必然趋势&#xff0c;全国智慧水务正如火如荼建设中。智慧水务聚焦供水安全保障与水务精细化管理&#xff0c;本文通过各应用场景深入分析智慧水务建设价值&#xff0c;提出智慧水务…

Redis集群(caluster)

Redis集群(caluster) Redis集群是一个提供在多个Redis节点间共享数据的程序集 1. Redis集群的作用: Redis 集群是 Redis 的分布式实现&#xff0c;在设计中按重要性顺序具有以下目标&#xff1a; 高性能和线性可扩展性&#xff0c;多达 1000 个节点。没有代理&#xff0c;使…

Pyqt应用相关之PDF汇总案例说明

相信有不少小伙伴遇到了想要把多份pdf汇总到一起的问题&#xff0c;本期就带来用Pyqt界面制作的关于pdf汇总的教学流程。 def pdf_files_btn_click(self):files QFileDialog.getOpenFileNames(self, os.getcwd(), opentxt, PDF Files(*.pdf))file_list files[0]self.pdf_file…

2023年6月DAMA-CDGP数据治理专家认证请尽快报名啦!

目前6月DAMA-CDGP数据治理认证考试开放报名地区有&#xff1a;北京、上海、广州、深圳、长沙、呼和浩特。 目前南京、济南、西安、杭州等地区还在接近开考人数中&#xff0c;打算参加6月考试的朋友们可以抓紧时间报名啦&#xff01;&#xff01;&#xff01; 5月初&#xff0c;…

(一)服务发现组件 Eureka

1、Eureka 简介 Eureka 是Spring Cloud Netflix 微服务套件中的一部分&#xff0c; 它基于Netflix Eureka 做了二次封装&#xff0c; 主要负责完成微服务架构中的服务治理功能。我们只需通过简单引入依赖和注解配置就能让Spring Boot 构建的微服务应用轻松地与Eureka 服务治理…

两百左右哪款蓝牙耳机好?两百左右高性价比蓝牙耳机推荐

现如今&#xff0c;蓝牙耳机无疑已经成为学生党外出的标配了。比起一些动辄上千的蓝牙耳机&#xff0c;两百左右的似乎更符合学生党的选择。接下来&#xff0c;我来给大家推荐几款两百左右高性价比的蓝牙耳机&#xff0c;一起来看看吧。 一、南卡小音舱Lite2蓝牙耳机 参考价&…

Spring 循环依赖处理之三级缓存设计

一、思考 1、Spring是如何解决循环依赖问题的? 2、为什么要使用三级缓存?二级缓存能否解决问题? 3、提前暴露对象暴露的是什么? 4、主要源码 二、循环依赖 1、介绍 如上图&#xff0c;创建A之前需要先创建B,创建B之前需要先创建A,造成循环依赖。 由于A没创建完成&am…

C++:IO流

CIO流 C系统实现了一个庞大的类库&#xff0c;其中ios为基类&#xff0c;其他类都是直接或间接派生自ios类 注意&#xff1a; 1. cin为缓冲流。键盘输入的数据保存在缓冲区中&#xff0c;当要提取时&#xff0c;是从缓冲区中拿。如果一次输 入过多&#xff0c;会留在那儿慢慢…

今年SMETA审核费用即将涨价

【今年SMETA审核费用即将涨价】 SMETA全称&#xff08; Sedex Members Ethical Trade Audit &#xff09;&#xff0c;即Sedex会员社会道德贸易审核&#xff0c;它是Sedex发起的一种负责任的供应链审计方法/项目。 Sedex是一个全球性的责任商业平台&#xff0c;SMETA是审核方法…

大白话chatGPT GPT的发展区别

大白话chatGPT & GPT的发展区别 从GPT名字理解chatGPTchatGPT三步曲GPT-1到GPT-4GPT-1~GPT-4的相同点GPT-1~GPT-4的区别GPT-1——pre-training fine-tune&#xff0c;自监督学习无监督预训练有监督微调GPT-2——zero-shot&#xff0c;无监督学习&#xff0c;多任务学习GPT…

机器学习快速入门1(机器学习概念与数据预处理)

文章目录 1.机器学习介绍2 机器学习7大步骤3.数据预处理八大策略4 缺省值、异常值、重复值处理**rand、randn、randint区别**normal与randn缺失值处理判断缺失值删除缺失行填充缺失值 重复值处理异常值处理 5 抽样VS全量数据为什么需要抽样简单随机抽样等距抽样分层抽样整群抽样…

【PR 基础】轨道遮罩键、交叉溶解的简单使用

在上篇博客&#xff08;【PR 基础】裁剪工具的简单使用&#xff09;介绍了裁剪效果的使用&#xff0c;本篇博客在上篇的基础上继续添加 轨道遮罩键、交叉溶解的效果。 效果 步骤 1.可以先将恢复裁剪区域的关键帧删除 2. 接下来添加字幕&#xff0c;点击 新建-》旧版标题 点击…