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) 空间。
相关推荐
记得早睡~2 分钟前
leetcode98-验证二叉搜索树
数据结构·算法·leetcode
COOCC110 分钟前
推荐系统排序阶段核心要点:多目标排序模型详解
神经网络·算法·机器学习·计算机视觉·自然语言处理
货拉拉技术18 分钟前
AI Agent搭建神器上线!货拉拉工作流让效率翻倍!
算法·llm
寂空_41 分钟前
【算法笔记】动态规划基础(一):dp思想、基础线性dp
c++·笔记·算法·动态规划
不会计算机的捞地1 小时前
【数据结构入门训练DAY-21】信息学奥赛一本通T1334-围圈报数
算法
小王努力学编程2 小时前
美团2024年春招第一场笔试 C++
开发语言·数据结构·c++·学习·算法
superior tigre2 小时前
C++学习:六个月从基础到就业——STL算法(一) 基础与查找算法
c++·学习·算法
刚入门的大一新生2 小时前
C++初阶-类和对象(下)
开发语言·c++·算法
清羽_ls2 小时前
leetcode-位运算
前端·算法·leetcode·位运算
猫猫头有亿点炸3 小时前
C语言中小写字母转大写字母
c语言·开发语言·算法