[牛客经典必刷算法题] LC8-重排链表

快手:链表重排(使用原地算法) import java.util.Scanner; // 时间复杂度O(n) 空间复杂度O(n) public class Main { public void reorderList(ListNode head){ if(head == null || head.next == null){ return ; } ListNode t = head; // 找到中间节点 ListNode te. 阅读详情

[牛客经典必刷算法题] LC8-重排链表

------------------------------本题链接---------------------------

题目描述

将给定的单链表 L : L 0 → L 1 → … → L n − 1 → L n L:L_0→L_1→…→L_{n-1}→L_ n L:L0​→L1​→…→Ln−1​→Ln​
重新排序为: L 0 → L n → L 1 → L n − 1 → L 2 → L n − 2 → … L_0→L_n →L_1→L_{n-1}→L_2→L_{n-2}→… L0​→Ln​→L1​→Ln−1​→L2​→Ln−2​→…
要求: 使用原地算法,不能改变节点内部的值,需要对实际的节点进行交换。

示例

输入
单链表:{10,20,30,40}
 
返回值
重新排序链表:{10,40,20,30}

思路

由于要将后半部分的节点插入前半部分,我们不妨将该链表一分为二,将后半部分链表倒序,然后再一个一个插入前半部分链表

算法过程

  1. 采用快慢指针找到中间节点
  2. 翻转后半部分链表
  3. 将倒序的后半部分链表插入前半部分链表中

解答

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public void reorderList(ListNode head) {
        if(head == null || head.next == null || head.next.next==null) return;
        ListNode fast = head, slow = head;
        // 1.快慢指针,寻找中间节点
        while(fast != null && fast.next != null){
            slow = slow.next;
            fast = fast.next.next;
        }
        // 2.翻转后半部分链表
        ListNode after = slow.next;
        slow.next = null;
        ListNode pre = null, tmp;
        while(after != null){
            // 暂存下一节点
            tmp = after.next;
            // 当前节点指向它原来的下一节点
            after.next = pre;
            // 保存当前节点,使其之后的点可以指向它
            pre = after;
            // 指针获取暂存信息,指向下一节点
            after = tmp;
        }
        
        // 3.合并链表
        ListNode first = head; // 前半部分
        after = pre; // 翻转的后半部分
        while(first != null && after != null){
            ListNode before_tmp = first.next;
            ListNode after_tmp = after.next;
            first.next = after;
            after.next = before_tmp;
            first = before_tmp;
            after = after_tmp;
        }
    }
}
产品失效你必须要知道的概念---MTBF、MTTF和FIT 如果我们想知道该电路在10年后仍能正常工作的几率,按照前面例子的相同计算步骤,结果将是90.3%。例如,假设一个TDK电容器的MTBF为6918年(16.5失效时间间隔,FIT),这并不意味着该电容器能持续这么久(显然,没有人能够对部件进行这么长时间的测试)。综上,MTBF和MTTF是用来描述系统或设备级别的故障间隔时间,而FIT是用来描述某单一器件的失效率的单位。MTBF和MTTF使用相同的计算方法,但MTBF用于可维修的产品,而MTTF用于不可维修或维修成本过高的产品。 阅读详情

相关推荐

HA集群 执行 hdfs haadmin -transitionToActive 失败

最近把一个单NameNode集群变更为HA集群,过程中都很顺利,nn1和nn2两个NameNode都显示standby状态,但是把nn1或者nn2切换到active状态时就会报错抛异常。 查看master上namenode启动日志,如下: Incompatible clusterID for journal Storage Directory /home/hadoop-zero/bigdat...

qq_34727158的博客 1763

leetcode + 链表重新给 排序,后半部分依次插入到前半部分

点击打开链接struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; class Solution { public: void reorderList(ListNode* head) { vector<ListNode*&...

小堃哥的专栏 348

多智能体强化学习中的Trust Region技术:HATRPO与HAPPO深度解析

本文深度解析多智能体强化学习中的Trust Region技术,重点探讨HATRPO(异质智能体信任区域策略优化)与HAPPO(异质智能体近端策略优化)两种先进算法。通过数学架构与工程实现细节,揭示其在解决联合策略空间爆炸、信用分配等挑战中的优势,并分享实际部署中的优化技巧与前沿进展。

weixin_29072299的博客 189

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→… Yo...

/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } ...

weixin_30768175的博客 274

算法 A 求稳健平均值和稳健标准差

文章目录算法原理代码 算法原理 算法 A 来自 GB/T 6379.5。应用此算法计算得到数据平均值和标准差的稳健值。稳健性是估计算法的特点,而不是其产生的估计值的特点,因此严格来说,称由此算法计算的平均值和标准差是稳健的是不确切的。然而,为避免使用繁琐的术语,“稳健均值”和“稳健标准差”应理解为利用稳健算法计算的总体均值和总体标准差的均值估计。 设数据为 xi,i∈(1,2,⋯ ,n)x_i, i\in(1,2,\cdots,n)xi​,i∈(1,2,⋯,n),记稳健平均值为 x∗,s∗x^*, s^*x

zhuo木鸟的博客 9251

Python广度优先搜索BFS - 蓝桥13届省赛污染海域

请问这片N * M海域中有几块是没被污染的独立海域(没被污染的独立海域是指该块海域上下左右被已污染的海域包围,且N * M以外的海域都为已被污染的海域)有一片海域划分为N * M个方格,其中有些海域已被污染(用0表示),有些海域没被污染(用1表示)。第二行开始输入N行,每行M个数字(数字只能为1或者0,1表示没被污染的海域,0表示已被污染的海域)这块4 * 5的海域,有3块海域(绿色)没被污染,因为每一块的上下左右都被污染的海域包围。输出一个整数,表示N * M的海域中有几块是没被污染的独立海域。

m0_69865359的博客 264

将单链表翻转

struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; 没有头结点的单链表,利用三个指针,在原来的基础上进行逆序。这种方法比较实用,效率也高。 ListNode *ReverseList(ListNode *head){ ListNode *pre,...

qq_41932243的博客 213

尚硅谷 Vue2.0 + Vue3.0 入门到精通教程学习笔记 (一)

本文为总结尚硅谷Vue2.0+Vue3.0 的学习笔记系列的第一章——Vue的核心,包含Vue简介、模板语法、数据绑定、MVVM模型、事件处理,计算属性与监视、class与style绑定、列表渲染、过滤器、内置指定和自定义指令以及Vue生命周期等知识点

weixin_44566194的博客 3655

2019秋季PAT甲级题解

7-1 Forever 题目: “Forever number” is a positive integer A with K digits, satisfying the following constrains: the sum of all the digits of A is m; the sum of all the digits of A+1 is n; and the greates...

weixin_44742521的博客 1264

WRF和WPS安装和编译时遇到的问题

检查是否自己netcdf和Fortran编译器一致。解决办法:修改configure.wps里的路径。如果没问题且wrf已成功编译,考虑重新。path修改为jasper在的路径。

m0_54898744的博客 1836

37、基于视觉的轻量级面部呼吸和心率测量技术

本文提出了一种基于视觉的轻量级面部呼吸和心率测量技术,通过远程光电容积脉搏波描记法(RPPG)和面部振动信息实现非接触式生理信号采集。创新性地结合框选和特征点选择多个感兴趣区域(ROI),并采用光流跟踪、主成分分析(PCA)和集成经验模态分解(EEMD)等方法优化信号处理流程。实验结果表明,该方法在测量精度和稳定性方面优于传统方法,并可在树莓派4等低功耗平台上实现实时运行,具有广泛的应用前景。

r7s8t的博客 306

PAT(甲级)2019年秋季考试 7-2 Merging Linked Lists (C++)

Given two singly linked lists L1=a1→a2→⋯→an−1→anL_1=a_1→a_2→⋯→a_{n−1}→a_nL1​=a1​→a2​→⋯→an−1​→an​ and L2=b1→b2→⋯→bm−1→bmL_2=b_1→b_2→⋯→b_{m−1}→b_mL2​=b1​→b2​→⋯→bm−1​→bm​. If n≥2mn≥2mn≥2m, you are supposed to reverse and merge the shorter one into the longer

Misdirection 331

9.6华为OD机试真题 新系统【仓储货物有序出库】

华为OD机试真题 新系统【仓储货物有序出库】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【仓储货物有序出库】多语言题解。

qq_45776114的博客 875

牛客网每日一道 LC8 重排链表(OnO1,找到链表中点+反转链表后半部分+重新链接) 6/147

/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { public void reorderList(ListNode head) {.

weixin_43774841的博客 199

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

牛客面试必刷101代码总结【python】

牛客面试题必刷101代码总结

Anthony_hit的博客 2326

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

迷茫的一周(刷牛客题) 2025/3/28

怀疑人生,知识学一次忘一次

yesyesyes_yes的博客 1055

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

附加3 Merging Linked Lists (25 分)

Given two singly linked lists L 1=a 1 →a 2​ →⋯→a n−1​ →a n and L 2 =b 1 →b 2 →⋯→b m−1 →b m . If n≥2m, you are supposed to reverse and merge the shorter one into the longer one to obtain a list like a 1 →a 2 →b m→a 3​ →a 4 →b m−1 ⋯. For example, given one l

weixin_51154479的博客 1102

链表-PTA-链表的游标实现

Merging Linked Lists Given two singly linked lists L​1​​=a​1​​→a​2​​→⋯→a​n−1​​→a​n​​ and L​2​​=b​1​​→b​2​​→⋯→b​m−1​​→b​m​​. If n≥2m, you are supposed to reverse and merge the shorter one into the longer one to obtain a list like a​1​​→a​2​​→b​m​​→a​3​​→a​4

SydneyCarton_的博客 383

PTA Merging Linked Lists

题目 Given two singly linked lists L1​=a1​→a2​→⋯→an−1​→anL_1​=a_1​→a_2​→⋯→a_{n−1}​→a_nL1​​=a1​​→a2​​→⋯→an−1​​→an​​ and L2​=b1​→b2​→⋯→bm−1​→bmL_2​=b_1​→b_2​→⋯→b_{m−1}​→b_mL2​​=b1​​→b2​​→⋯→bm−1​​→bm​​. If n≥2m, you are supposed to reverse and merge the shorter

QYQHxyh的博客 487

02-线性结构2 一元多项式的乘法与加法运算 (20 分)

02-线性结构2 一元多项式的乘法与加法运算 (20 分) 设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。 输入样例: 4 3 4 -5 2 6 1 -2 0 3 5 20 -7 4 3 1 输出样例: 1

weixin_45207880的博客 1245

2019 PAT甲级秋季考试7-2 Merging Linked Lists (25 分)

Given two singly linked lists L​1​​=a​1​​→a​2​​→⋯→a​n−1​​→a​n​​ and L​2​​=b​1​​→b​2​​→⋯→b​m−1​​→b​m​​. If n≥2m, you are supposed to reverse and merge the shorter one into the longer one to obtain a list like a​1​​→a​2​​→b​m​​→a​3​​→a​4​​→b​m−1​​⋯. For exam

0 801

链表后半部分节点倒序插入前半部分节点中

问题描述 将链表后半部分的节点插入到前半部分节点,使得链表1->2->3->4变成1->4->2->3,或者1-2->3->4->5变成1->5->2->4->3 根据上述问题可知,将表的后一半的节点从后往前依次插入到前半部分的节点中间,第一步需要找到中间节点链表分成两个部分,前半部分的数量是大于或者等于后半部分的,第二步则是将后半部分的链表逆序,第三步就遍历后半部分的链表,将其插入前半部分的各节点中间 寻找中间节点 /* 利

Lc_summer的博客 625

【PAT甲级 2019 9月.8号】 满分题解 -- 很久没写了 考研期间算是对其一个阶段告落的总结

考前两个月疯狂刷题155 * 1.5 + 晴神 20 + 模拟题 * 4 时间投入的可有点大,初试冲啊 7-1Forever(20分) "Forever number" is a positive integerAwithKdigits, satisfying the following constrains: the sum of all the digits ofAis...

小落的博客 989

PAT(甲级)2019年秋季考试 7-2 Merging Linked Lists (25 分)凌宸1642

PAT(甲级)2019年秋季考试 7-2 Merging Linked Lists (25 分) 题目描述: Given two singly linked lists L1=a1→a2→⋯→an−1→an and L2=b1→b2→⋯→bm−1→bm. If n≥2m, you are supposed to reverse and merge the shorter one into the longer one to obtain a list like a1→a2→bm→a3→a4→bm−1⋯.

lingchen1120的博客 461

牛客剑指offer刷题算法篇

对于排序数组,首先想到的就是二分法,通过不断二分查找到相同数字的第一个出现位置和最后出现位置,则可计算出出现次数;输入: scores = [2, 2, 3, 4, 4, 4, 5, 6, 6, 8], target = 4。某班级考试成绩按非严格递增顺序记录于整数数组 scores,请返回目标成绩 target 的出现次数。输入: scores = [1, 2, 3, 5, 7, 9], target = 6。

故不积跬步无以至千里 363

NC2 重排链表

描述 将给定的单链表\ LL:L_0→L_1→…→L_{n-1}→L_ nL0​→L1​→…→Ln−1​→Ln​ 重新排序为:L_0→L_n →L_1→L_{n-1}→L_2→L_{n-2}→…L0​→Ln​→L1​→Ln−1​→L2​→Ln−2​→… 要求使用原地算法,不能只改变节点内部的值,需要对实际的节点进行交换。 示例1 输入: {1,2,3,4} 复制返回值: {1,4,2,3} 复制说明: 给定head链表1->2->3->4, 重新排列为 1...

Meiko记录 298
上一篇: [牛客经典必刷算法题] LC7-非递归求二叉树的前序遍历
下一篇: [牛客经典必刷算法题] LC9-链表中环的入口节点
Coder_JC_Liu
博客等级 码龄7年 2粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值