问题:
有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。
结构体定义如下:
struct complex_node
{
int value;
struct complex_node *next;
struct complex_node *sibling;
};
分析:
简单的方法就是根据next,将所有的节点复制一遍,这个时间复杂度是O(n)的,然后计算sibling,由于sibling没有固定的位置,需要从头开始寻找,所以一个查找一个节点时间复杂度为O(n),如果有m个sibling,那么sibling所花的时间是O(m*n)。这里可以用hash的方式来快速寻找,但是空间复杂度会变为O(n),用空间换取时间。
另一种方法,这种方法来自《剑指offer》,算法分为三个步骤:
1,和上面的方法一样,复制根据next复制节点。但是这里讲复制好的节点直接跟在原节点之后,如下图所示:
2,复制sibling指针。这里方法比较简单了,碰到N节点,判断是否有sibling,如果有,那么将N'的sibling赋值N->sibling->next,比较好理解。
3,将新复制的链表和原链表分离。分离的话,根据next指针,奇数和偶数分开就行。
代码见转载的博客。
总结:
刚刚看到这种方法,太美妙了,如此简单、清晰的解决办法。
摘自:http://zhedahht.blog.163.com/blog/static/254111742010819104710337/