复杂链表的复制

问题:

有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。

结构体定义如下:

struct complex_node

{

int value;

struct complex_node *next;

struct complex_node *sibling;

};

程序员面试题精选100题(49)-复杂链表的复制 - 何海涛 - 微软、Google等面试题

分析:

简单的方法就是根据next,将所有的节点复制一遍,这个时间复杂度是O(n)的,然后计算sibling,由于sibling没有固定的位置,需要从头开始寻找,所以一个查找一个节点时间复杂度为O(n),如果有m个sibling,那么sibling所花的时间是O(m*n)。这里可以用hash的方式来快速寻找,但是空间复杂度会变为O(n),用空间换取时间。

另一种方法,这种方法来自《剑指offer》,算法分为三个步骤:

1,和上面的方法一样,复制根据next复制节点。但是这里讲复制好的节点直接跟在原节点之后,如下图所示:

程序员面试题精选100题(49)-复杂链表的复制 - 何海涛 - 微软、Google等面试题

2,复制sibling指针。这里方法比较简单了,碰到N节点,判断是否有sibling,如果有,那么将N'的sibling赋值N->sibling->next,比较好理解。

程序员面试题精选100题(49)-复杂链表的复制 - 何海涛 - 微软、Google等面试题

3,将新复制的链表和原链表分离。分离的话,根据next指针,奇数和偶数分开就行。

程序员面试题精选100题(49)-复杂链表的复制 - 何海涛 - 微软、Google等面试题

代码见转载的博客。

总结:

刚刚看到这种方法,太美妙了,如此简单、清晰的解决办法。

摘自:http://zhedahht.blog.163.com/blog/static/254111742010819104710337/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值