题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
思路:N‘连接在N的后面,可以以O(n)的时间复制特殊指针的指向,再将两个链表分离
1 class Solution { 2 public: 3 void CloneNodes(RandomListNode *pHead) 4 { 5 while(pHead) 6 { 7 RandomListNode *tmp=new RandomListNode(pHead->label); 8 tmp->next=pHead->next; 9 pHead->next=tmp; 10 pHead=tmp->next; 11 } 12 } 13 void CloneRandomNodes(RandomListNode *pHead) 14 { 15 while(pHead) 16 { 17 if(pHead->random)pHead->next->random=pHead->random->next; 18 else pHead->next->random=NULL; 19 pHead=pHead->next->next; 20 } 21 } 22 RandomListNode * ReconnectNodes(RandomListNode *pHead) 23 { 24 RandomListNode *newHead=NULL; 25 RandomListNode *tmp=NULL; 26 if(pHead) 27 { 28 newHead=pHead->next; 29 tmp=newHead; 30 pHead->next=newHead->next; 31 pHead=pHead->next; 32 } 33 while(pHead) 34 { 35 tmp->next=pHead->next; 36 tmp=tmp->next; 37 pHead->next=tmp->next; 38 pHead=pHead->next; 39 } 40 return newHead; 41 } 42 RandomListNode* Clone(RandomListNode* pHead) 43 { 44 CloneNodes(pHead);//复制所有节点 45 CloneRandomNodes(pHead);//复制特殊指针指向关系 46 return ReconnectNodes(pHead);//分离两个链表 47 } 48 };
好吧,递归的写法竟然会超时
1 class Solution { 2 public: 3 void CloneNodes(RandomListNode *pHead) 4 { 5 if(pHead==NULL)return; 6 RandomListNode *tmp=new RandomListNode(pHead->label); 7 tmp->next=pHead->next; 8 pHead->next=tmp; 9 CloneNodes(tmp->next); 10 } 11 void CloneRandomNodes(RandomListNode *pHead) 12 { 13 while(pHead) 14 { 15 if(pHead->random)pHead->next->random=pHead->random->next; 16 else pHead->next->random=NULL; 17 pHead=pHead->next->next; 18 } 19 } 20 RandomListNode * ReconnectNodes(RandomListNode *pHead) 21 { 22 if(pHead==NULL)return NULL; 23 RandomListNode *tmpHead=pHead->next; 24 pHead->next=tmpHead->next; 25 tmpHead->next=ReconnectNodes(pHead->next); 26 return tmpHead; 27 } 28 RandomListNode* Clone(RandomListNode* pHead) 29 { 30 CloneNodes(pHead); 31 CloneRandomNodes(pHead); 32 return ReconnectNodes(pHead); 33 } 34 };