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

leetcode:随机链表的复制

题目描述

题目链接:138. 随机链表的复制 - 力扣(LeetCode)

 

题目分析

这个题目很长,但是意思其实很简单:就是一个单链表,每个结点多了一个指针random随机指向链表中的任意结点或者NULL,我们血需要复制这个链表,连同random一起复制下来

思路一

思路一是我们用cur遍历链表,用for循环找random对应的原链表中的random,这个算法找每个random的时间复杂度都是O(N),整个算法的时间复杂度是O(N^2)

思路二

思路二是分三步走:

  1. 将copy结点链接到原结点的next
  2. copy结点的random指向对应原结点random的next
  3. 把copy链表拆接下来尾插到新链表

这个思路更优,时间复杂度是O(N)

画图

我们可以简单画图来演示一下这三步:

1.copy结点插入到原结点的next

定义cur遍历链表,用malloc开辟一个copy的空间,然后依次将cur->val赋给copy->val,接着将copy结点插入到cur和cur->next之间,cur走到copy-.>next

2.处理copy结点的random

让cur回到head,经过第一步之后我们知道copy就是cur->next,这里我们分为两种情况:

  • 如果cur->random指向NULL,则copy->next也指向NULL
  • 否则copy->random指向cur->random->next

然后cur走到cur->next->next

3.copy结点拆解下来进行尾插

最后一步就是尾插,定义newhead和tail先指向NULL,cur回到head,copy是cur->next,next保存copy->next

将cpoy尾插到tail,将cur->next接到next恢复原链表,最后返回newhead

代码示例

我们根据思路二来写代码:

/**
 * Definition for a Node.
 * struct Node {
 *     int val;
 *     struct Node *next;
 *     struct Node *random;
 * };
 */

struct Node* copyRandomList(struct Node* head) {
	//copy结点插入到原结点的后面
    struct Node*cur=head;
    while(cur)
    {
        struct Node*copy=(struct Node*)malloc(sizeof(struct Node));
        copy->val=cur->val;
        copy->next=cur->next;
        cur->next=copy;
        cur=cur->next->next;
    }
    //处理copy结点的random
    cur=head;
    while(cur)
    {
        struct Node*copy=cur->next;
        if(cur->random==NULL)
        {
            copy->random=NULL;
        }
        else
        {
            copy->random=cur->random->next;
        }
        cur=cur->next->next;
    }
    //copy结点拆下来尾插
    cur=head;
    struct Node*newhead=NULL,*tail=NULL;
    while(cur)
    {
        struct Node*copy=cur->next;
        struct Node*next=copy->next;
        if(tail==NULL)
        {
            newhead=tail=copy;
        }
        else
        {
            tail->next=copy;
            tail=tail->next;
        }
        cur->next=next;
        cur=next;
    }
    return newhead;
}

结果同样通过:


http://www.kler.cn/news/150058.html

相关文章:

  • 【Python】获取ip
  • NTT 的各类优化:Harvey、PtNTT,Intel AVX2、ARM Neon、GPGPU
  • oracle的sysaux使用量排查sql
  • 【ChatGLM3-6B】Docker下部署及微调
  • 6.golang函数
  • C语言变量和常量
  • Veras:Revit AI渲染插件
  • Mybatis 使用枚举作为查询条件
  • Linux:Ubuntu系统安装软件
  • 【Spring之事务底层源码解析,持续更新中~~~】
  • Elasticsearch:向量搜索 (kNN) 实施指南 - API 版
  • 使用Java给钉钉群发消息
  • 【小聆送书第一期】让架构师的成神之路温暖你这个不景气的冬天
  • GPTS-生成一个动漫图像GPT
  • 2023-简单点-picamera2中的取消auto focus,进行手动焦距设定
  • 算法通关村第十二关|青铜|字符串转换整数
  • 题目标题:卫星定位(胡宁静) 暴力解法
  • php如何对比浮点数大小(bccomp函数)
  • 代码的并发问题
  • ASCII sorting
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • RabbitMQ消息模型之发布订阅Publish-Subscribe
  • docker中安装mysql,远程连接
  • 基于docker的onlyoffice使用--运行JavaSpringExample
  • 你了解vue的diff算法吗?
  • go学习之文件操作与命令行参数
  • leetcode 283. 移动零
  • JavaScript基础知识总结
  • Java 关于批量插入遇到的问题 -sqlserver
  • 配置阿里云的yum仓库