zoukankan      html  css  js  c++  java
  • 【Leetcode】【Hard】Copy List with Random Pointer

    A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.

    Return a deep copy of the list.

    解题思路:

    本题要求新建一个链表,使其完全等于输入链表,相当于对输入链表深复制。

    题目的难点在于,原链表中有random指针,指向原链表对应的结点。当新链表建立时,需要对新结点的random指针赋值,使其指向新链表中的对应结点。这样就不能简单的复制地址,需要在新结点建立后,再找到对应正确的地址。暴力解法的时间复杂度为o(n2)。

    o(n)的解法:

    将每一个新结点,建立在旧结点的后面,形成:old1->new1->old2->new2->...oldN->newN->...;o(n)

    建立后,重新遍历这个加长链表,new1->random = old1->random->next;o(n)

    最后将新旧链表拆分;o(n)

    最终时间复杂度为o(n),空间复杂度为o(1)

    代码:

     1 /**
     2  * Definition for singly-linked list with a random pointer.
     3  * struct RandomListNode {
     4  *     int label;
     5  *     RandomListNode *next, *random;
     6  *     RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
     7  * };
     8  */
     9 class Solution {
    10 public:
    11     RandomListNode *copyRandomList(RandomListNode *head) {
    12         if (head == NULL)
    13             return head;
    14         
    15         RandomListNode* oldNode = head;
    16         RandomListNode* nodeLeft = NULL;
    17         RandomListNode* newNode = NULL;
    18         RandomListNode* newList = NULL;
    19         
    20         while (oldNode) {
    21             nodeLeft = oldNode->next;
    22             oldNode->next = new RandomListNode(oldNode->label);
    23             oldNode->next->next = nodeLeft;
    24             oldNode = nodeLeft;
    25         }
    26         
    27         oldNode = head;
    28         newList = head->next;
    29         
    30         while (oldNode) {
    31             newNode = oldNode->next;
    32             if (oldNode->random == NULL)
    33                 newNode->random = NULL;
    34             else 
    35                 newNode->random = oldNode->random->next;
    36             oldNode = newNode->next;
    37         }
    38         
    39         oldNode = head;
    40         while (oldNode) {
    41             newNode = oldNode->next;
    42             oldNode->next = newNode->next;
    43             oldNode = oldNode->next;
    44             if (oldNode)
    45                 newNode->next = oldNode->next;
    46         }
    47         
    48         return newList;
    49     }
    50 };
  • 相关阅读:
    开源项目中标准文件命名和实践
    linux远程拷贝命令-scp
    Linux访问Windows共享目录的方法——smbclient
    ADB Fix error : insufficient permissions for device
    APT典型应用示例
    我的参考书籍列表
    GCC Reference
    GNU make简介
    Windows下搭建Android NDK开发环境及命令行编译
    Git命令行基本操作
  • 原文地址:https://www.cnblogs.com/huxiao-tee/p/4594460.html
Copyright © 2011-2022 走看看