题目描述:
归并排序
请实现 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。
来源:力扣(LeetCode)
算法实现:
解题思路
该题的主要难度在于random指针的修改
采用hash表
1、先根据旧链表生成一个新的链表,将旧链表的内容全都放入新链表中,在生成的过程中,使用hash表将旧链表的指针当做key,新链表指针当做键值一一对应。
2、遍历一次新链表,利用hash表将random指针当做key键获得新的指针再赋值给random。
# Definition for a Node.
"""
class Node:
def __init__(self, x, next=None, random=None):
self.val = int(x)
self.next = next
self.random = random
"""
class Solution(object):
def __init__(self):
self.dic=dict()
def copyRandomList(self, head):
"""
:type head: Node
:rtype: Node
"""
if head==None:
return
new_head=Node(head.val,None,head.random)
p=head
new_p=new_head
self.dic[p]=new_p
while p.next!=None:
p=p.next
node=Node(p.val,None,p.random)
new_p.next=node
new_p=new_p.next
self.dic[p]=new_p
new_p=new_head
while new_p!=None:
new_p.random=self.dic.get(new_p.random,None)
new_p=new_p.next
return new_head