要求
时间限制:1秒 空间限制:32768K 热度指数:288812
本题知识点: 链表
算法知识视频讲解
题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
思路
该问题体现了分而治之的思想,即把复杂问题分解为几个简单的小问题进行解决。时间复杂度和空间复杂度都为 O ( n ) O(n) O(n)。
python实现
# -*- coding:utf-8 -*-
# class RandomListNode:
# def __init__(self, x):
# self.label = x
# self.next = None
# self.random = None
class Solution:
# 返回 RandomListNode
def Clone(self, pHead):
# write code here
if not pHead:
return None
p = pHead
# 为每个节点复制一个节点接在其后
while p:
newNode = RandomListNode(p.label)
newNode.next = p.next
p.next = newNode
p = p.next.next
# 为复制的节点增加random指针指向
p = pHead
while p:
p.next.random = p.random.next if p.random else None
p = p.next.next
# 拆分链表
p = pHead
newHead = pHead.next
pcp = newHead
while p:
p.next = p.next.next
pcp.next = pcp.next.next if pcp.next else None
p = p.next
pcp = pcp.next
return newHead
-
运行时间:29ms
-
占用内存:5856k
C++实现
/*
struct RandomListNode {
int label;
struct RandomListNode *next, *random;
RandomListNode(int x) :
label(x), next(NULL), random(NULL) {
}
};
*/
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead)
{
if (!pHead)
return NULL;
RandomListNode *p = pHead;
// 为每个节点复制一个节点并且插入它的后面
while (p){
RandomListNode *newNode = new RandomListNode(p->label);
newNode->next = p->next;
p->next = newNode;
// 紧跟着的为newNode
p = p->next->next;
}
// 再遍历一次链表找到random指针值
p = pHead;
while (p){
p->next->random = p->random==NULL?NULL:p->random->next;
p = p->next->next;
}
// 拆分两个链表
p = pHead;
RandomListNode *pclone = p->next;
RandomListNode *newpHead = p->next;
while (p){
p->next = p->next->next;
pclone->next = pclone->next==NULL?NULL:pclone->next->next;
p = p->next;
pclone = pclone->next;
}
return newpHead;
}
};
-
运行时间:4ms
-
占用内存:500k