数据结构——单链表OJ题(第二弹)

2023-11-05

在这里插入图片描述


前言

此次练习题有两道!
有点小难度,但相信难不住大家的!

我也会给出两道OJ题的链接,大家也赶快去试一试吧


一、返回链表开始入环的第一个节点

题目链接:OJ链接
在这里插入图片描述
在这里插入图片描述

提示:

链表中节点的数目范围在范围 [0, 104] 内
-105 <= Node.val <= 105
pos 的值为 -1 或者链表中的一个有效索引

本题有两个解析思路~
在这里插入图片描述
在这里插入图片描述

思路一

在这里插入图片描述
代码演示:

//解题方法一
struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode *move1=head;
    struct ListNode *move2=head;
    while(move1&&move2&&move2->next){//快慢指针移动
        move1=move1->next;
        move2=move2->next->next;
            if(move1==move2){{//找到相遇点
            struct ListNode *meet=move1;//meet从相遇点开始移动
            struct ListNode *move3=head;//move3从head开始移动
            while(meet!=move3){//两个指针同时移动找到起始点
                meet=meet->next;
                move3=move3->next;
            }
            return meet;
        }
    }
   
    return NULL;
}

思路二

在这里插入图片描述

提示:如果不了解如何找出公共点的的话,前面的博客会对大家有所帮助!
博客链接:单链表OJ题

代码演示:

//解题方法二
struct ListNode *detectCycle(struct ListNode *head) {
   struct ListNode *move1=head;
   struct ListNode *move2=head;
   while(move1&&move2&&move2->next){//快慢指针移动
        move1=move1->next;
        move2=move2->next->next;
        if(move1==move2){//找到相遇点
            struct ListNode *temp=move1;//保存相遇点位置
            move1=move1->next;//将move1变为第二链表起始点
            temp->next=NULL;//将相遇点的next置空
            struct ListNode *head1=head;
            struct ListNode *head2=move1;
            int len1=0,len2=0;
            while(head1!=NULL){//计算链表长度
                len1++;
                head1=head1->next;
            }
            while(head2!=NULL){
                head2=head2->next;
                len2++;
            }
            int k=abs(len1-len2);//得到两链表长度相减的绝对值
            //将longs指向较长的链表,shorts指向较短的链表
            struct ListNode *shorts=head;
            struct ListNode *longs=move1;
            if(len1>len2){
                shorts=move1;
                longs=head;
            }
            while(k--&&longs!=NULL){//较长的链表移动k位
                longs=longs->next;
            }
            if(k>0&&longs==NULL){
                return NULL;
            }
            while(shorts!=longs){//两链表同时遍历,找到第一个公共点
                shorts=shorts->next;
                longs=longs->next;
            }
            return longs;
         }
    }
    return NULL;
}

二、返回链表的深度拷贝

题目链接:OJ链接
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

提示:

0 <= n <= 1000
-104 <= Node.val <= 104
Node.random 为 null 或指向链表中的节点。

解题思路:
在这里插入图片描述
在这里插入图片描述

代码演示

struct Node* BuyNewnode(int x){//创建结点函数
    struct Node*newnode=(struct Node*)malloc(sizeof(struct Node));
    newnode->val=x;
    newnode->next=NULL;
    newnode->random=NULL;
    return newnode;
}
//查找random所在位置的函数
struct Node* findrandom(struct Node* head,struct Node* newhead,struct Node* random){
    struct Node*move1=head;
    struct Node*move2=newhead;
    while(move1!=random){
        move1=move1->next;
        move2=move2->next;
    }
    return move2;
}

struct Node* copyRandomList(struct Node* head) {
	struct Node*move=head;
    struct Node*newhead=NULL;
    struct Node*tail=NULL;
    while(move!=NULL){//将新建结点依次尾插到新链表中
         if(tail==NULL){
            struct Node*newnode= BuyNewnode(move->val);
            newhead=tail=newnode;
            move=move->next;
         }
              else{
             struct Node*newnode= BuyNewnode(move->val);
             tail->next=newnode;
             tail=tail->next;
             move=move->next;
         }
    }
    struct Node*setran=newhead;
    struct Node*findran=head;
      while(setran&&findran){
        struct Node*temp=findrandom(head,newhead,findran->random);
        setran->random=temp;
        setran=setran->next;
        findran=findran->next;
    }
    return newhead;
}

总结

这次的题目稍稍有些难度!
但是绝对难不倒大家的!
加油! 加油!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构——单链表OJ题(第二弹) 的相关文章

随机推荐

  • mybatis中使用map批量更新

    最近项目中会用到批量更新功能 数据是存在map中的 key作为更新的id 而value作为更新的值 纠结了很久最后算是解决了 特此记录 希望对有需要的有一定帮助
  • 数据库数据库连接:1、短连接 2、长连接  3、连接池介绍和区别

    一 数据库连接 1 短连接 2 长连接 3 连接池 二 短连接 短连接是指程序与数据库通信时建立的连接 执行操作后 马上就关闭 短连接简单地来说 就是每次操作数据库 都要打开和关闭数据连接 基本操作是 连接 数据传输 关闭连接 三 长连接
  • Android TextView 属性 textsize 的单位是什么?

    首选我们找到 源码中的TextView 找到 textsize 属性 一个 int 类型默认值为 15 初使化自定义属性 我们看一个 getDeimensionPixelSize 方法的解释可以看出 获取 是 15 单位是什么 是px 那我
  • 蓝桥真题-网站扩张

    代码 package com hualing lanqiao import java util Scanner public class Expansion 网站扩张 规则 第一个人使用7天后 在第八天可以邀请另一个人使用 后每隔两天可以邀
  • 应急响应 - Windows启动项分析,Windows计划任务分析,Windows服务分析

    作者简介 CSDN top100 阿里云博客专家 华为云享专家 网络安全领域优质创作者 推荐专栏 对网络安全感兴趣的小伙伴可以关注专栏 网络安全入门到精通 Windows应急响应 一 启动项分析 1 msconfig 2 gpedit ms
  • Mybatis

    第1章 框架概述 1 1 软件开发常用结构 1 1 1 三层架构 三层架构包含的三层 界面层 User Interface layer 业务逻辑层 Business Logic Layer 数据访问层 Data access layer 三
  • 小熊带你学Python(六)——字符串

    上一节提到序列的应用 序列就是指代的字符串 列表 元组 集合 字典等数据结构的一个集合 我们先从字符串开始讲起 字符串 是一串字母的集合 我们在编程实现各种功能时 很多时候其实都是在操作这些字符串 字符串的变化中实现了各种功能 1 字符串的
  • Springboot项目优化日志logback-spring.xml详解

    Springboot项目优化日志logback spring xml详解 一 描述 二 配置文件 三 效果 一 描述 几种常见的日志 Log4j 是最早的日志框架 是apach旗下的 可以单独使用 也可配合日志框架JCL使用 Log4j2
  • 仅提供信息存储空间服务器,Docker本身的存储空间管理

    原标题 Docker本身的存储空间管理 目标 两台host主机透过一个网络接口共享磁盘设备 iSCSI 共享设备的主机和名字 target dev loop8 gt initiator dev sdb gt initiator docker
  • 摄影毁一生单反穷三代顺口溜_什么?这点预算你竟买了一套摄影设备!

    图片 来自网络 文字 小松鼠 看了文章标题而点进来的朋友们 都是有这方面想法的 本文适合于家境一般的业余摄影爱好者 如果家里有矿或是立志成为专业摄影师的 就没必要往下看了 注 文末有福利 以下为正文 先来一组图 光照的光 花光的光 俗话说
  • 简单的线性单向链表

    数组的不足 我们之前用的数组也是一种数据结构 数组是顺序存储的 数组逻辑关系上相邻的两个元素在物理位置上也相邻 这就导致了在对数组进行插入或删除操作时 需移动大量数组元素 并且数组的长度是固定的 而且必须预先定义 数组的长度难以缩放 对长度
  • glut实现雪花动态效果

    glut实现雪花动态效果 实验题目 总体思路 3 2主要函数说明 按键操作 实验结果 实验题目 1 绘制雪花 2 在屏幕的多个随机位置绘制雪花 3 使每朵雪花绕自己的中心旋转 4 使每朵雪花下降 5 翻页键控制相机视野 按UP键增加物体与观
  • Vue中使用element-plus中的el-dialog定义弹窗-内部样式修改-v-model实现-demo

    效果图 实现代码
  • Three.js系列: 造个海洋球池来学习物理引擎

    github地址 https github com hua1995116 Fly Three js 大家好 我是秋风 继上一篇 Three js系列 游戏中的第一 三人称视角 今天想要和大家分享的呢 是做一个海洋球池 海洋球大家都见过吧 就
  • 北京突然宣布,元宇宙重大消息

    北京青年报记者从2022全球数字经济大会新闻发布会上了解到 2022全球数字经济大会将于7月28日至30日在国家会议中心举行 本届大会将聚焦绿色创新发展 数字贸易 数据价值化 全球规则治理等热点议题 深度探讨互联网3 0 数据要素 开源 5
  • JS的100道经典面试题(一)只看这四篇就够了,收藏起来以后偷偷看

    年轻人你不讲武德 耗子尾汁 总结就是为了形成自己的js知识网 提升自己 加油 开始干 1 介绍js的基本数据类型 答 Undefined Null Boolean Number String 2 js有哪些内置对象 答 数据封装类对象 Ob
  • 深度学习优化学习方法(一阶、二阶)

    深度学习优化学习方法总结 一阶为主 https blog csdn net sunflower sara article details 81321886 常用的优化算法 梯度下降法 牛顿法 拟牛顿法 共轭梯度法 二阶为主 https bl
  • Block底层原理读书笔记-《高级编程- iOS与OS多线程和内存管理》(更新中)

    1 一个Block 真正的底层都有些什么 Block会被解析成一个结构体 这里成为Block结构体 这个结构体里有 1 isa指针 说明Block的本质是一个对象 指向Stack 堆 2 有函数指针 这个函数指针指向一个函数体 该函数体的内
  • C# 企业微信接口发送消息出现错误代码60020解决方案,希望能给大家带来帮助。

    这是企业微信接口发送消息调用的代码源地址 https blog csdn net wanglui1990 article details 79744407 代码运行起来是没有问题的 但唯一出现的问题就是错误代码60020 点击企业微信 应用
  • 数据结构——单链表OJ题(第二弹)

    单链表OJ题 前言 一 返回链表开始入环的第一个节点 思路一 思路二 二 返回链表的深度拷贝 总结 前言 此次练习题有两道 有点小难度 但相信难不住大家的 我也会给出两道OJ题的链接 大家也赶快去试一试吧 一 返回链表开始入环的第一个节点