LeetCode | Copy List with Random Pointer(赋值带有随机指针的链表)
2014-08-20 11:52
423 查看
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.
题目解析:
这道题在剑指offer上看到过,由于情况比较复杂,如果对于随机指针,每次都要遍历一次确定位置,就时间复杂度就达到O(n^2)。
方案一:hash表
我们复制结点的时候,保存<N,N'>配对信息在哈希表中。第二遍的时候再对随机指针进行赋值,由于有配对信息,那么当N->next = m的时候,我们找到 m' 就好了。就能很快的查找到目标。
典型的利用空间换取时间的方法。
方案二:分治法的特殊应用
现在的方案是,将新的结点全部创建到纠结点后面,那么新结点的random就为p->random->next;这样就方便赋值了。
最后要将新旧链表都恢复。
Return a deep copy of the list.
题目解析:
这道题在剑指offer上看到过,由于情况比较复杂,如果对于随机指针,每次都要遍历一次确定位置,就时间复杂度就达到O(n^2)。
方案一:hash表
我们复制结点的时候,保存<N,N'>配对信息在哈希表中。第二遍的时候再对随机指针进行赋值,由于有配对信息,那么当N->next = m的时候,我们找到 m' 就好了。就能很快的查找到目标。
典型的利用空间换取时间的方法。
方案二:分治法的特殊应用
现在的方案是,将新的结点全部创建到纠结点后面,那么新结点的random就为p->random->next;这样就方便赋值了。
最后要将新旧链表都恢复。
class Solution { public: RandomListNode *copyRandomList(RandomListNode *head) { if(head == NULL) return head; RandomListNode *p = head; while(p){ RandomListNode *q = new RandomListNode(p->label); q->next = p->next; p->next = q; p = q->next; } p = head; while(p){ RandomListNode *q; q = p->next; if(p->random) //由于已经在初始化的时候将新创建的结点random指针赋值为NULL不用处理 q->random = p->random->next; //必须要在p->random非空的时候,才能next。 p = q->next; } RandomListNode *clonehead = head->next; RandomListNode *pclone = clonehead; RandomListNode *h = head; //同时恢复两个链表 while(pclone->next){ h->next = pclone->next; pclone->next = pclone->next->next; pclone = pclone->next; h = h->next; } h->next = NULL; //不要忘了赋值为NULL return clonehead; } };
相关文章推荐
- (不会)[LeetCode] Copy List with Random Pointer 拷贝带有随机指针的链表
- [LeetCode] Copy List with Random Pointer 拷贝带有随机指针的链表
- LeetCode138 Copy List with Random Pointer(深度复制带有随机指针的链表) Java题解
- [Leetcode] Copy list with random pointer 对带有任意指针的链表深度拷贝
- 【LeetCode-面试算法经典-Java实现】【143-Copy List with Random Pointer(有随机指针的链表复制)】
- Copy List with Random Pointer复制带有随机指针的链表
- 【LeetCode-面试算法经典-Java实现】【138-Copy List with Random Pointer(拷贝有随机指针的单链表)】
- Copy List with Random Pointer 复制有随机指针的链表@LeetCode
- LeetCode之复制有random指针的链表Copy List with Random Pointer
- LeetCode OJ 之 Copy List with Random Pointer(复制含有随机指针的链表)
- Copy List with Random Pointer(复制有随机指针的链表)
- [LeetCode]—Copy List with Random Pointer 深度复制带“任意指针”的链表
- [LintCode] 复制带随机指针的链表 Copy List with Random Pointer
- 附有随机结点指针的链表的深度拷贝 Copy List with Random Pointer
- [LeetCode]Copy List with Random Pointer &Clone Graph 复杂链表的复制&图的复制
- leetcode---copy-list-with-random-pointer---链表
- LeetCode OJ:Copy List with Random Pointer(复制存在随机链接的链表)
- LeetCode刷题笔记(链表):copy-list-with-random-pointer
- LeetCode——Copy List with Random Pointer(带random引用的单链表深拷贝)
- LeetCode(Copy List with Random Pointer) 复杂链表的深拷贝