【数据结构】LeetCode160.相交链表 138.随即链表复制 牛客——链表回文问题

【数据结构】LeetCode160.相交链表 138.随即链表复制 牛客——链表回文问题

文章目录

一、相交链表问题

问题描述

给定两个单链表,判断它们是否相交,若相交则返回相交的节点。(注意:判断依据是节点地址是否相同,而非节点值,因为节点值可能存在重复。)


在这里插入图片描述

解题思路分析

思路一:暴力遍历法
  • 方法:遍历链表A,对于A中的每一个节点,遍历整个链表B,检查是否存在地址相同的节点。
  • 时间复杂度:O(M*N)(若两链表长度分别为M和N)
  • 空间复杂度:O(1)
  • 缺点:效率低,不适用于长链表。
思路二:双指针对齐法(最优解)
  • 方法:
    1. 分别遍历两个链表,计算各自长度。
    2. 求出两链表长度差 gap
    3. 让较长的链表的指针先移动 gap 步。
    4. 然后两个指针同时移动,逐个比较节点地址,第一个相同的节点即为交点。
  • 时间复杂度:O(M + N)
  • 空间复杂度:O(1)
  • 优点:高效,适用于任意长度的链表。
在这里插入图片描述

思路2的时间复杂度更低,所以我们选择思路2

具体代码如下

structListNode*getIntersectionNode(structListNode*headA,structListNode*headB){structListNode* curA=headA,*curB=headB;int lenA=1,lenB=1;while(curA->next){ curA=curA->next; lenA++;}while(curB->next){ curB=curB->next; lenB++;}int gap=abs(lenA-lenB);//假设法 先假设A长structListNode* longList=headA;structListNode* shortList=headB;if(lenA<lenB){ longList=headB; shortList=headA;}while(gap--){ longList=longList->next;}while(longList){if(longList==shortList)return longList; longList=longList->next; shortList=shortList->next;}returnNULL;}

二、链表的回文结构

问题描述

判断一个单链表是否为回文结构。即正着读和反着读都一样

在这里插入图片描述

解题思路

回文链表判断的关键在于对称性验证。我们可以通过以下步骤实现:

  1. 找到中间节点:使用快慢指针法,快指针每次走两步,慢指针每次走一步,当快指针到达末尾时,慢指针正好在中间。
  2. 反转后半部分链表:从中间节点开始,将后半部分链表反转。
  3. 比较前后两部分:从头节点和反转后的中间节点开始,逐个比较节点值是否相同。

完整代码

class PalindromeList { public: //寻找中间节点 struct ListNode* middleNode(struct ListNode* head) { // 初始化快慢指针 struct ListNode* slow = head; struct ListNode* fast = head; // 移动指针直到fast到达链表末尾 while (fast != NULL && fast->next != NULL) { slow = slow->next; // 慢指针每次移动一步 fast = fast->next->next; // 快指针每次移动两步 } return slow; // 慢指针指向中间节点 } //反转链表 struct ListNode* reverseList(struct ListNode* head) { struct ListNode* n1, *n2, *n3; n1 = NULL; n2 = head; if (n2) n3 = n2->next; while (n2) { n2->next = n1; n1 = n2; n2 = n3; if (n3) n3 = n3->next; } return n1; } bool chkPalindrome(ListNode* A) { // write code here struct ListNode*mid=middleNode(A); struct ListNode*rmid=reverseList(mid); while(rmid&&A) { if(rmid->val!=A->val) return false; rmid=rmid->next; A=A->next; } return true; } }; 

三、 随即链表的复制

问题描述

实现一个函数,复制一个含有随机指针的链表。随机指针可以指向链表中的任何节点或为空。

在这里插入图片描述

解题思路

常规链表的复制很简单,但随机指针的存在使得问题复杂化。因为随机指针可能指向尚未复制的节点。我们可以通过以下三步解决:

  1. 插入拷贝节点:在原链表的每个节点后插入一个拷贝节点,值与原节点相同。
  2. 设置随机指针:拷贝节点的随机指针应指向原节点随机指针所指节点的下一个节点(即其拷贝)。
  3. 分离链表:将混合链表分离为原链表和拷贝链表。
在这里插入图片描述
structNode*copyRandomList(structNode* head){//拷贝节点插到原节点后边structNode*cur=head;while(cur){structNode* copy=(structNode*)malloc(sizeof(structNode));//分配内存 copy->next=cur->next; cur->next=copy; copy->val=cur->val; cur=copy->next;//cur走到原链表的下一个 }//控制random cur=head;while(cur){structNode* copy = cur->next;if(cur->random==NULL)//不要写成random==NULL{ copy->random=NULL;}else{ copy->random=cur->random->next;//核心代码} cur=copy->next;}//把拷贝链表尾插起来structNode* copyhead=NULL,*copytail=NULL; cur=head;while(cur){structNode*copy=cur->next;if(copytail==NULL){ copyhead=copytail=copy;}else{ copytail->next=copy; copytail=copytail->next;} cur=copy->next;}return copyhead;}

复杂度分析

  • 时间复杂度:O(N),三次遍历链表。
  • 空间复杂度:O(1),除了返回的拷贝链表外,仅使用了常数个额外指针。

Read more

【002】Windows系统下Java下载 JDK

文章目录 * @[TOC](文章目录) * 前言 * **1. 下载 JDK** * **2. 安装 JDK** * **3. 配置 JAVA_HOME 环境变量** * **4. 验证安装是否成功** * **常见问题与提示** 前言 这里下载安装的是 java17 的jdk 1. 下载 JDK * Oracle 官方 JDK 17: * 官网地址:https://www.oracle.com/java/technologies/downloads/#jdk17 * 注意:需要注册/登录 Oracle 账户。 * 或者选择 OpenJDK 17(推荐,无需登录): * 推荐发行版:Eclipse

By Ne0inhk
【LeetCode必刷好题】:Java顺序表实现杨辉三角

【LeetCode必刷好题】:Java顺序表实现杨辉三角

🎁个人主页:User_芊芊君子 🎉欢迎大家点赞👍评论📝收藏⭐文章 🔍系列专栏:Java.数据结构 【前言】 杨辉三角作为经典的数学与编程结合案例,是理解二维数组和动态列表操作的绝佳素材。本文将带你从逻辑拆解、问题分析、优化方向等角度进行详细解析,带你彻底掌握杨辉三角的实现精髓。 文章目录: * 一、杨辉三角思路分析 * 二、代码实现 * 三、总结 一、杨辉三角思路分析 杨辉三角每一行数字都是上一行两个相邻数字之和 思路分析: 创建一个二维列表List<List<Integer>>,储存整个三角外层循环控制行数 i,0~numRows内层循环是列数 j,小于 i每一行第一个和最后一个是1中间元素通过上一行相邻元素加得 二、代码实现 publicclassTest{publicList<List<Integer&

By Ne0inhk
计算机毕业设计java基于javaweb的超市销售管理系统 基于B/S架构的超市进销存与销售管理平台设计与实现 面向零售业的商品采购与销售订单管理系统开发

计算机毕业设计java基于javaweb的超市销售管理系统 基于B/S架构的超市进销存与销售管理平台设计与实现 面向零售业的商品采购与销售订单管理系统开发

计算机毕业设计java基于javaweb的超市销售管理系统2kf7s9 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。 随着零售行业的快速发展和市场竞争的日益激烈,超市作为商品流通的重要终端,其管理效率直接影响着经营成本和盈利能力。传统的超市销售管理多依赖于手工记账、纸质单据或单机Excel表格,存在商品信息更新不及时、库存管理混乱、销售数据难以统计、会员信息分散等问题,难以满足现代化超市对高效、精准、智能化管理的需求。基于JavaWeb的超市销售管理系统应运而生,它通过互联网技术将员工信息、会员档案、供应商管理、商品分类、商品信息、商品采购、销售订单等功能进行数字化整合,实现了超市销售全流程的线上化、规范化管理。该系统不仅提升了超市运营效率,也为管理者提供了数据驱动的决策支持,成为零售业数字化转型的重要工具。 系统核心功能概览: * 用户注册与登录:支持员工、管理员两类角色的注册与登录。 * 个人中心:用户可查看和修改个人资料,如员工工号、姓名、性别、手机、头像等。 * 员工管理:管理员可管理员工信

By Ne0inhk
JDK的下载与安装:从入门到精通

JDK的下载与安装:从入门到精通

一、什么是JDK? JDK(Java Development Kit)是Java开发工具包的缩写,它是Java开发的核心组件。JDK不仅包含了Java运行环境(JRE),还包含了一系列开发工具(如编译器javac、调试器jdb等)和基础类库。 JDK组成结构 JDKJRE开发工具JVM核心类库javacjavajavadocjdb 二、JDK下载指南 1. 选择JDK版本 目前主流版本有: * Java 8(LTS长期支持版) * Java 11(LTS) * Java 17(LTS) * 最新版本(如Java 21) 对于初学者,建议选择Java 11或Java 17,因为它们都是长期支持版本。 2. 下载步骤 1. 访问Oracle官网:https://www.oracle.com/java/technologies/ 2. 选择&

By Ne0inhk