复杂链表的复制
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
O(n2)算法:
第一步是复制原始链表上的每一个结点,并用Next节点链接起来;
第二步是设置每个结点的Sibling节点指针。
O(n)辅助空间
第一步复制原始链表上的每个结点N创建N',然后把这些创建出来的结点用Next链接起来。同时我们把<N,N'>的配对信息放到一个哈希表中。 第二步还是设置复制链表上每个结点的m_pSibling。由于有了哈希表,我们可以用O(1)的时间根据S找到S'。
O(n)不借助辅助空间
1、根据原始链表的每个结点N创建对应的N'
2、设置复制出来的结点的Sibling。(把N'的Sibling指向N的Sibling)
3、把这个长链表拆分成两个链表:把奇数位置的结点用Next链接起来就是原始链表,偶数数值的则是复制链表
/* public class RandomListNode { int label; RandomListNode next = null; RandomListNode random = null; RandomListNode(int label) { this.label = label; } } */ public class Solution { public void buildOfList(RandomListNode pHead){ RandomListNode p=pHead; while(p!=null){ RandomListNode temp=new RandomListNode(p.label); temp.next=p.next; temp.random=null; p.next=temp; p=temp.next; } } public void buildRandomList(RandomListNode pHead){ RandomListNode p=pHead; RandomListNode q; while(p!=null){ q=p.next; if(p.random!=null){ q.random=p.random.next; } p=q.next; } } public void cloneList(RandomListNode pHead,RandomListNode cloneHead){ RandomListNode p=pHead; RandomListNode q=cloneHead; while(p!=null && q!=null){ q.next=p.next; q=p.next; p.next=q.next; p=q.next; } } public RandomListNode Clone(RandomListNode pHead) { if(pHead==null) return null; RandomListNode cloneHead=new RandomListNode(0); buildOfList(pHead); buildRandomList(pHead); cloneList(pHead,cloneHead); return cloneHead.next; } }
立志如山 静心求实