Talk is cheap.
/**
* Definition for singly-linked list with a random pointer.
* type ListNode struct {
* Val int
* Next *ListNode
* Random *ListNode
* }
*/
func copyRandomList(head *ListNode) *ListNode {
if head == nil {
return head
}
p1, p2, p3 := head, head, head
for p1 != nil {
tmp := &ListNode{ Val: p1.Val, Next: p1.Next, Random: nil }
p1.Next = tmp
p1 = p1.Next.Next
}
for p2 != nil {
tmp := p2.Next
if p2.Random != nil { tmp.Random = p2.Random.Next }
p2 = p2.Next.Next
}
dummy := p3.Next
tmp := dummy
for p3 != nil {
p3.Next = p3.Next.Next
if p3.Next != nil { tmp.Next = p3.Next.Next }
p3, tmp = p3.Next, tmp.Next
}
return dummy
}