AcWing 48. 复杂链表的复刻(剑指offer)

请实现一个函数可以复制一个复杂链表。

在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针指向链表中的任意结点或者null。

注意:

函数结束后原链表要与输入时保持一致。

思路:
挺有难度的一道题,没写出来。

解法一:O(n) ,使用map,记录每个节点与新节点的对应关系,那么当我们需要新节点的node -> next后者node -> random时,就需要对应旧节点的相应域值,然后使用map找到对应的新节点

解法二:O(n),省map。将复制后的节点插入原节点的后面,那么random节点就是源节点random节点的下一个节点。然后分开两个链表。

class Solution {
public:
    ListNode *copyRandomList(ListNode *head) {
        if(!head) return NULL;
        ListNode* node = head;
        map<ListNode*,ListNode*>mp;
        while(node) {
            ListNode* NewNode = new ListNode(node -> val);
            mp[node] = NewNode;
            node = node -> next;
        }
        node = head;
        ListNode* NewHead = mp[head];
        ListNode* NewNode = NewHead;
            
        while(node) {
            NewNode -> next = mp[node -> next];
            if(node -> random) {
                NewNode -> random = mp[node -> random];
            }
            NewNode = NewNode -> next;
            node = node -> next;
        }
        return NewHead;
    }
};
class Solution {
public:
    ListNode *copyRandomList(ListNode *head) {
        if(!head) return NULL;
        ListNode* node = head;
        while(node) {
            ListNode* NewNode = new ListNode(node -> val);
            NewNode -> next = node -> next;
            node -> next = NewNode;
            node = NewNode -> next;
        }
        
        node = head;
        while(node) {
            ListNode* NewNode = node -> next;
            if(node -> random != NULL) {
                NewNode -> random = node -> random -> next;
            }
            node = NewNode -> next;
        }
        
        node = head;
        ListNode* NewHead = node -> next;
        ListNode* NewNode = node -> next;
        
        
        int cnt = 0;
        while(node) {
            cnt++;
            node -> next = NewNode -> next;
            node = node -> next;
            
            if(node == NULL) NewNode -> next = NULL;
            else NewNode -> next = node -> next;
            NewNode = NewNode -> next;
        }
        
        return NewHead;
    }
};

发布了844 篇原创文章 · 获赞 28 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/tomjobs/article/details/104946990