题目
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点或者为null
),返回结果为复制后复杂链表的head。
分析
方法一
时间复杂度是 $O(n_2)$。
思路:
- 复制原始链表上的每个节点,并用
next
连接起来; - 设置节点的
random
指针,在原始链表中定位random
指向的节点,从头节点开始查找经过s
步,然后在新链表中也从头节点开始,经过s
步就是对应的节点。
方法二
空间复杂度是 $O(n)$,时间复杂度是$O(n)$。
思路:
- 复制原始链表上的每个节点,并用
next
连接起来; - 在复制节点的时候,用哈希表把
<N, N'>
的配对信息存储起来; - 利用哈希表来设置
random
指针的时间复杂度为$O(n)$。
方法三
时间复杂度是$O(n)$,不需要辅助空间。
思路:
- 复制原始链表上的每个节点,并每个复制的节点链接在原节点的后面;
- 设置节点的
random
指针,假设原节点 N 的random
指向节点 S,则其对应的复制节点 N’ 的random
指向节点 S的下一个节点 S’; - 拆分链表,把奇数位的节点链接起来就是原始链表,把偶数位的节点链接起来就是复制链表。
Step1:
Step2:
Step3:
实现
|
|