zoukankan      html  css  js  c++  java
  • leecode 剑指 Offer 35. 复杂链表的复制

    剑指 Offer 35. 复杂链表的复制

    请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。

    示例 1:

     

    输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
    输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

    示例 2:

     

    输入:head = [[1,1],[2,1]]
    输出:[[1,1],[2,1]]


    示例 3:

     

    输入:head = [[3,null],[3,0],[3,null]]
    输出:[[3,null],[3,0],[3,null]]

    示例 4:

    输入:head = []
    输出:[]

    解释:给定的链表为空(空指针),因此返回 null。

    解法一:

    思路参考:https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/solution/lian-biao-de-shen-kao-bei-by-z1m/481293

    1. 复制每一个结点,使得复制后的结点都在当前结点的下一个结点,例如A->B-C变成A->A'->B->B'->C->C'

    2. 设置每个副本结点的random指针
    3.将链表断开,例如A->A'->B->B'->C->C'变成A'->B'->C',且注意这一步应当将原链表复原

     1 /*
     2 // Definition for a Node.
     3 class Node {
     4     int val;
     5     Node next;
     6     Node random;
     7 
     8     public Node(int val) {
     9         this.val = val;
    10         this.next = null;
    11         this.random = null;
    12     }
    13 }
    14 */
    15 class Solution {
    16     public Node copyRandomList(Node head) {
    17         if(head == null)
    18             return null;
    19 
    20         // 复制每一个结点,使得复制后的结点都在当前结点的下一个结点,例如A->B-C变成A->A'->B->B'->C->C'
    21         Node cur = head;
    22         Node tmp = null;
    23         while(cur != null){
    24             tmp = new Node(cur.val);
    25             tmp.next = cur.next;
    26             cur.next = tmp;
    27             cur = tmp.next;
    28         }
    29 
    30         // 第二步将random指针连接起来
    31         cur = head; // cur指针复位,重新指向链表头部
    32         while(cur != null){
    33             if(cur.random != null){
    34                 cur.next.random = cur.random.next;
    35             }
    36             cur = cur.next.next;
    37         }
    38 
    39         // 第三步将链表断开,例如A->A'->B->B'->C->C'变成A'->B'->C',且注意这一步应当将原链表复原
    40         Node copyList = head.next, copycur = head.next;
    41 
    42         cur = head;
    43         while(cur != null){
    44             cur.next = cur.next.next;
    45             cur = cur.next;
    46             if(copycur.next != null){
    47                 copycur.next = copycur.next.next;
    48                 copycur = copycur.next;
    49             }
    50         }
    51         return copyList;
    52     }
    53 }

    leetcode运行时间为0ms, 空间为38.7MB

    复杂度分析:

    时间复杂度:遍历了三次链表,所以时间复杂度为O(3n)

    空间复杂度:每个结点都被拷贝了一次,所以空间复杂度为O(n)

  • 相关阅读:
    做足以让自己骄傲的活
    Count(*) 与 count(field) 一样吗?
    Explain Plan试分析
    Oracle SQL Developer中查看解释计划Explain Plan的两种方法
    整理+学习《骆昊-Java面试题全集(上)》
    【转】Java就业指导
    如何清晰的、高质量的给面试官介绍自己的电商项目【借鉴】
    留存的图片
    Linux学习_006_JavaEE程序员常用linux命令整理
    给Linux初学者的七个建议,值得一读
  • 原文地址:https://www.cnblogs.com/hi3254014978/p/13746535.html
Copyright © 2011-2022 走看看