剑指 Offer 35. 复杂链表的复制
复杂链表的复制
题目描述:
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
示例 1:
输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]
示例 2:
输入:head = [[1,1],[2,1]]
输出:[[1,1],[2,1]]
示例 3:
输入:head = [[3,null],[3,0],[3,null]]
输出:[[3,null],[3,0],[3,null]]
示例 4:
输入:head = []
输出:[]
解释:给定的链表为空(空指针),因此返回 null。
提示:
-10000 <= Node.val <= 10000
Node.random 为空(null)或指向链表中的节点。
节点数目不超过 1000 。
思路:
时间复杂度:O(n),空间复杂度O(n)
使用map做最容易想到,用两个map,一个放node到位置,一个放位置到node,遍历两次
代码:
/**
* Definition for a Node.
* type Node struct {
* Val int
* Next *Node
* Random *Node
* }
*/
func copyRandomList(head *Node) *Node {
if head == nil{
return nil
}
mp := make(map[int]*Node, 0)
mp_int := make(map[*Node]int ,0)
tmp := head
for k:=0; tmp != nil; k++{
node := new(Node)
node.Val = tmp.Val
mp[k] = node
mp_int[tmp] = k
tmp = tmp.Next
}
tmp = head
for k:=0; tmp != nil; k++{
mp[k].Next = mp[k+1]
if tmp.Random != nil{
mp[k].Random = mp[mp_int[tmp.Random]]
}else{
mp[k].Random = nil
}
tmp = tmp.Next
}
return mp[0]
}
代码效率:
执行用时:4 ms, 在所有 Go 提交中击败了100.00%的用户
内存消耗:3.5 MB, 在所有 Go 提交中击败了38.17%的用户
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!