LeetCode 解题思路 16(Hot 100)

解题思路:

  1. 初始化辅助节点:
  • dummy:哑节点。
  • pre:当前链表的前一个节点。
  • start:当前链表的第一个节点。
  • end:当前链表的最后一个节点。
  • nextStart:end.next,下组链表的第一个节点,用于连接当前链表尾部。
  1. 翻转当前的链表:
  • 断开当前链表与剩余链表组,end.next = null。
  • 通过 start 翻转链表并得到翻转后的头节点 newHead = reverse(start)。
  1. 连接翻转后链表:
  • 头部:pre.next = newHead;
  • 尾部:start.next = nextStart;
  1. 更新状态: pre = start。

Java代码:

java 复制代码
class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        if (head.next == null || k == 1) return head;

        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode pre = dummy;

        while (true) {
            ListNode start = pre.next;
            ListNode end = pre;
            for(int i = 0; i < k && end != null; i++){
                end = end.next;
            }
            if (end == null) break;
            ListNode nextStart = end.next;

            end.next = null;
            ListNode newHead = reverse(start);

            pre.next = newHead;
            start.next = nextStart;
            
            pre = start;
        }

        return dummy.next;
    }

    public ListNode reverse(ListNode head) {
        ListNode current = head;
        ListNode pre = null;
        while (current != null) {
            ListNode temp = current.next;
            current.next = pre;
            pre = current;
            current = temp; 
        }
        return pre;
    }
}

复杂度分析:

  • 时间复杂度: O(n)。
  • 空间复杂度: O(1),无额外空间占用。

解题思路:

  1. 第一次遍历: 创建复制节点并建立映射。
  2. 第二次遍历: 设置next和random指针。

Java代码:

java 复制代码
class Solution {
    public Node copyRandomList(Node head) {
        if (head == null) return null;
        Map<Node, Node> map = new HashMap<>();

        Node pre = head;
        while (pre != null) {
            map.put(pre, new Node(pre.val));
            pre = pre.next;
        }

        pre = head;
        while (pre != null) {
            Node copy = map.get(pre);
            copy.next = map.get(pre.next);
            copy.random = map.get(pre.random);
            pre = pre.next;
        }

        return map.get(head);
    }
}

复杂度分析:

  • 时间复杂度: O(n),需要两次遍历链表,每次遍历时间为 O(n),总时间为 O(2n) = O(n)。
  • 空间复杂度: O(n),哈希表存储所有原节点到复制节点的映射,占用 O(n) 空间。
相关推荐
Dream it possible!1 小时前
CCF CSP 第30次(2023.09)(1_坐标变换_C++)(先输入再计算;边输入边计算)
c++·算法·csp
Terrence Shen1 小时前
跟着AI复习一下pytorch原理和操作
人工智能·pytorch·python·深度学习·算法·机器学习
军训猫猫头2 小时前
80.Dictionary 字典 C#例子
开发语言·算法·c#
码农幻想梦2 小时前
实验5 逻辑回归
算法·机器学习·逻辑回归
听微雨2 小时前
P9241 [蓝桥杯 2023 省 B] 飞机降落
算法·深度优先
平生不喜凡桃李3 小时前
对最近的刷题做一个小总结(关于动态规划和贪心)
算法·动态规划·双指针
zhangzeyuaaa3 小时前
深度学习有哪些算法?
人工智能·深度学习·算法
CodeJourney.3 小时前
探索ima.copilot:个人知识库搭建的AI新利器
数据库·人工智能·python·算法
天行者@4 小时前
OTSU算法(大津算法)
人工智能·opencv·算法·二值化
小码农<^_^>4 小时前
数据结构--算法篇
数据结构·算法