[LeetCode题解]143. 重排链表 | 快慢指针 + 反转
解题思路
找到右边链表,再反转右边链表,然后按左、右逐一合并
代码
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     public int val;
 *     public ListNode next;
 *     public ListNode(int val=0, ListNode next=null) {
 *         this.val = val;
 *         this.next = next;
 *     }
 * }
 */
public class Solution {
    public void ReorderList(ListNode head) {
        // 找到右边链表,再反转,然后逐一合并
        if(head == null || head.next == null) {
            return;
        } 
        // 找到右边链表
        ListNode fast = head, slow = head;
        while(fast.next != null && fast.next.next != null) {
            fast = fast.next.next;
            slow = slow.next;
        }
        ListNode rightHead = slow.next;
        slow.next = null;   // 拆分左右两链表
        ListNode left = head;
        ListNode right = Reverse(rightHead);    // 反转右边链表
        // 使用虚拟头,按左、右逐一合并
        ListNode dummy = new ListNode();
        ListNode cur = dummy;
        while(left != null && right != null) {
            cur.next = left;
            cur = cur.next;
            left = left.next;
            cur.next = right;
            cur = cur.next;
            right = right.next;
        }
        cur.next = left != null ? left : right;
        head = dummy.next;  // 最后把 head 指向新的链表的头
    }
    private ListNode Reverse(ListNode head) {
        ListNode cur = head, pre = null;
        while(cur != null) {
            var nextTmp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = nextTmp;
        }
        return pre;
    }
}
复杂度分析
- 时间复杂度:\(O(n)\),其中 \(n\) 是链表长度。相当于进行了两次遍历,因此时间复杂度为 \(O(n)\)。
 - 空间复杂度:\(O(1)\)。只使用了几个节点指针。
 
[LeetCode题解]143. 重排链表 | 快慢指针 + 反转的更多相关文章
- [LeetCode题解]141. 环形链表 | 快慢指针
		
题目描述 给定一个链表,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的 ...
 - [LeetCode题解]234. 回文链表 | 快慢指针 + 反转链表
		
解题思路 找到后半部分链表,再反转.然后与前半部分链表比较 代码 /** * Definition for singly-linked list. * public class ListNode { ...
 - [LeetCode题解]86. 分隔链表 | 三指针 + 虚拟头节点
		
解题思路 三指针,一个指向前半部分待插入位置,一个指向后半部分待插入位置,最后一个从前往后遍历 代码 /** * Definition for singly-linked list. * public ...
 - Java实现 LeetCode 143 重排链表
		
143. 重排链表 给定一个单链表 L:L0→L1→-→Ln-1→Ln , 将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→- 你不能只是单纯的改变节点内部的值,而是需要实际的进行节 ...
 - 【Warrior刷题笔记】143.重排链表 【线性化 || 双指针+翻转链表+链表合并】详细注释
		
题目一 力扣143.重排链表 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reorder-list/ 1.描述 给定一个单链表L的头节点he ...
 - [LeetCode题解]109. 有序链表转换二叉搜索树 | 快慢指针 + 递归
		
题目描述 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: ...
 - [LeetCode题解]142. 环形链表 II | 快慢指针
		
解题思路 本题是在141. 环形链表基础上的拓展,如果存在环,要找出环的入口. 如何判断是否存在环,我们知道通过快慢指针,如果相遇就表示有环.那么如何找到入口呢? 如下图所示的链表: 当 fast 与 ...
 - Leetcode 143.重排链表
		
重排链表 给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示 ...
 - [Leetcode] Reorder list 重排链表
		
Given a singly linked list L: L 0→L 1→…→L n-1→L n,reorder it to: L 0→L n →L 1→L n-1→L 2→L n-2→… You ...
 
随机推荐
- spring boot:使用多个redis数据源(spring boot 2.3.1)
			
一,什么情况下需要使用多个redis数据源? 为了缓存数据,通常我们会在线上使用多个redis的cluster, 每个cluster中缓存不同的数据,以方便管理. 例如:我们缓存了杂志文章/商品信息/ ...
 - swoole创建进程
			
<?php /** * Created by PhpStorm. * User: mac * Date: 2020/4/23 * Time: 21:57 */ use Swoole\Proces ...
 - .NET Core开源任务调度平台ScheduleMaster上新了
			
ScheduleMaster上一次比较大的更新还是在6月份,转眼已经快过去4个月了,这段时间比较忙,中间只更新过一次修复了几个小bug.要总结这次更新的话,必须要用"千呼万唤始出来" ...
 - zookeeper核心之ZAB协议就这么简单!
			
背景 我们都知道 Zookeeper 是基于 ZAB 协议实现的,在介绍 ZAB 协议之前,先回顾一下 Zookeeper 的起源与发展. Zookeeper 究竟是在什么样的时代背景下被提出?为了解 ...
 - 基于.Net Core开发的物联网平台 IoTSharp V1.5 发布
			
很高兴的宣布新版本的发布, 这次更新我们带来了大量新特性, 最值得关注的是, 我们逐步开始支持分布式, 这意味着你可以通过多台服务器共同处理数据, 而不是原来的单机处理, 我们也将遥测数据进行分开存储 ...
 - soct的创建方法
			
服务器端:ServerSocket提供的实例 ServerSocket server = new ServerSocket(端口号) 客户端:Socket提供的实例 Socket client = ...
 - Vue-cli3以上安装jquery
			
vue-cli3以上就没有webpack.config.js这个文件了,所以在安装jquery时 终端执行 npm install jquery --save 之后查看package.json 安装 ...
 - 自动化运维Ansible-01-安装及简单的使用
			
实验环境:Centos 7.x Ansible版本:ansible 2.9.13 服务端的操作 1.系统默认的yum仓库中没有找到ansible,这里我们先安装epel源(需要用到CentOS-Bas ...
 - 关于spring @scope("prorotype") 和 @aspectj 一起用的问题
			
前段时间听别人说prototype 模式的bean用@Aspectj做AOP会导致内存泄漏, 于是自己研究了下总结出几点 1.aspectj 如果是采用javac 编译 会动态产生代理类 代理类是 ...
 - Numpy入门(简单)
			
NumPy介绍 最近因为需要使用python做一个数据处理的项目,所以粗略的学习了一下numpy,在此分享一下自己学习中遇到的一些问题和一些基础的名词. 什么是NumPy? python用于科学计算的 ...