题目地址(35. 复杂链表的复制)
https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/
题目描述
请实现 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 <= 10000Node.random 为空(null)或指向链表中的节点。节点数目不超过 1000 。注意:本题与主站 138 题相同:https://leetcode-cn.com/problems/copy-list-with-random-pointer/
前置知识
公司
- 暂无
思路
关键点
代码
- 语言支持:Java
Java Code:
/*// Definition for a Node.class Node {int val;Node next;Node random;public Node(int val) {this.val = val;this.next = null;this.random = null;}}*/class Solution {public Node copyRandomList(Node head) {if(head == null){return null;}Node cur = head;//1. 将链表 1->2->3 构建成 1->1->2->2->3->3while (cur != null) {Node temp = new Node(cur.val);temp.next = cur.next;cur.next = temp;cur = cur.next.next;}//2. 让复制出来的链表的random = 原来的random.nextcur = head;while (cur != null) {if (cur.random != null) {cur.next.random = cur.random.next;}cur = cur.next.next;}//3. 拆分复制的链表 并将原来的链表还原cur = head.next;//指向初始链表的开头Node pre = head;//最后返回的复制的链表Node res = head.next;while (cur.next != null) {//顺序不能反 如果先cur的话 pre.next.next 就会指向更改后的cur.nextpre.next = pre.next.next;cur.next = cur.next.next;pre = pre.next;cur = cur.next;}//最后记得把初始的链表的最后一个节点指向null 不然还是指向的复制链表的最后一个pre.next = null;return res;}}
复杂度分析
令 n 为数组长度。
- 时间复杂度:
#card=math&code=O%28n%29&id=AtqDT)
- 空间复杂度:
#card=math&code=O%28n%29&id=KqqSo)
