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

题目描述

在这里插入图片描述

思路分析

原链表上进行修改,完成next和random之后,从原链表分离。

代码展示

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* next;
    Node* random;
    
    Node(int _val) {
        val = _val;
        next = NULL;
        random = NULL;
    }
};
*/
class Solution {
public:
    Node* copyRandomList(Node* head) {
        if (!head) {
            return head;
        }
        Node* newHead = head;
        while (newHead) {//first copy
            Node* cur = new Node(newHead->val);
            cur->next = newHead->next;
            newHead->next = cur;
            newHead = cur->next;
        }
        newHead = head;
        while (newHead) {//second copy
            Node* curRad = newHead->random;
            if (curRad) {
                newHead->next->random = curRad->next;
            }else {
                newHead->next->random = NULL;
            }

            newHead = newHead->next->next;
        }
        newHead = head;
        Node* ret = head->next;
        Node* cur = newHead->next;
        while (newHead) {//last update
            newHead->next = cur->next;
            newHead = newHead->next;
            if (newHead == NULL) {
                cur->next = NULL;
                break;
            }
            cur->next = newHead->next;
            cur = cur->next;
        }
        return ret;
    }
};

结果分析

在这里插入图片描述
时间复杂度O(N)
空间复杂度O(N)

猜你喜欢

转载自blog.csdn.net/ifwecande/article/details/107938783
今日推荐