当前位置: 首页 > article >正文

力扣 143.重排链表【详细手写】

一、题目

前置题目
力扣 206.反转链表
力扣 876. 链表的中间结点
在这里插入图片描述

二、思路

观察链表发现链表是部分有序,奇数位置的节点组成前半段的原链表,偶数位置的节点组成后半段的反转链表。因此,首先需要找到中间节点(力扣 876. 链表的中间结点),将原链表分为前半段和后半段链表,再将后半段链表进行反转(力扣 876. 链表的中间结点),再将两个链表按次序合并即可。
在这里插入图片描述

三、代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public void reorderList(ListNode head) {
        // 寻找中间节点
        ListNode mid = midNode(head);
        // 将 mid 之后的链表作为一个新的链表 l2
        ListNode l2 = mid.next;
        // 将 head 至 mid 作为新链表 l1
        ListNode l1 = head;
        mid.next = null;
        // 反转 l2
        l2 = reverseList(l2);
        // 合并 l1 和 l2
        mergeList(l1, l2);
    }
    // 寻找中间节点
    public ListNode midNode(ListNode head) {
        ListNode slow = head, fast = head;
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }
        return slow;
    }
    // 反转链表
    public ListNode reverseList(ListNode head) {
        ListNode pre = null;
        ListNode cur = head;
        while (cur != null) {
            ListNode curNext = cur.next;
            cur.next = pre;
            pre = cur;
            cur = curNext;
        }
        return pre;
    }
    // 合并链表
    public void mergeList(ListNode l1, ListNode l2) {
        ListNode l1_tmp, l2_tmp;
        while (l1 != null && l2 != null) {
            l1_tmp = l1.next;
            l2_tmp = l2.next;
            l1.next = l2;
            l2.next = l1_tmp;

            // 更新
            l2 = l2_tmp;
            l1 = l1_tmp;
        }
    }
}

http://www.kler.cn/news/361974.html

相关文章:

  • Go:error处理机制和函数
  • 什么是感知与计算融合?
  • Vulnhub打靶-Empire-LupinOne
  • Docker基础部署
  • AOP 面向切面编程
  • 给EXE添加网络验证激活码(卡密)
  • 华三服务器R4900 G5在图形界面使用PMC阵列卡(P460-B4)创建RAID,并安装系统(中文教程)
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-16
  • 英伟达开源超强模型Nemotron-70B;OpenAI推出Windows版ChatGPT桌面客户端
  • wps安装教程
  • 在Jmeter中的JSR223 PreProcessor使用javascript实战
  • ubuntu20 工作区独立
  • springboot063知识管理系统(论文+源码)_kaic
  • 鸿蒙_入门
  • 【雷电模拟器命令合集操作大全】官方文档整理贴
  • mysql查询id不在列表中的记录
  • Python使用faker批量生成测试模拟数据到MySQL
  • Python Pandas 安装指南:快速入门与验证
  • java使用 IDEA自动补全功能 AI 插件
  • springboot+jpa 配置多数据源
  • LabVIEW提高开发效率技巧----高效文件I/O
  • 微信小程序上传图片添加水印
  • ARM/Linux嵌入式面经(四六):华为
  • transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)的计算过程
  • qt5.12.12插件机制无法加载插件问题
  • 毕业生找工作的攻略:从校园到职场的成功之路