LeetCode算法题(Go语言实现)_32

题目

在一个大小为 n 且 n 为 偶数 的链表中,对于 0 <= i <= (n / 2) - 1 的 i ,第 i 个节点(下标从 0 开始)的孪生节点为第 (n-1-i) 个节点 。
比方说,n = 4 那么节点 0 是节点 3 的孪生节点,节点 1 是节点 2 的孪生节点。这是长度为 n = 4 的链表中所有的孪生节点。
孪生和 定义为一个节点和它孪生节点两者值之和。
给你一个长度为偶数的链表的头节点 head ,请你返回链表的 最大孪生和 。

一、代码实现

func pairSum(head *ListNode) int {// 快慢指针找中点slow, fast := head, headfor fast.Next != nil && fast.Next.Next != nil {slow = slow.Nextfast = fast.Next.Next}// 反转后半部分链表(网页2、4、5)var prev *ListNodecurrent := slow.Nextslow.Next = nil // 断开前后半链表for current != nil {next := current.Nextcurrent.Next = prevprev = currentcurrent = next}// 计算最大孪生和(网页3、4)maxSum := 0p1, p2 := head, prevfor p1 != nil && p2 != nil {sum := p1.Val + p2.Valif sum > maxSum {maxSum = sum}p1 = p1.Nextp2 = p2.Next}return maxSum
}

二、算法分析

1. 核心思路
  • 双指针分割:通过快慢指针将链表分为前后两半
  • 链表反转:反转后半部分链表以实现对称访问
  • 并行遍历:同时遍历前半段和反转后的后半段计算孪生和
2. 关键步骤
  1. 快慢指针定位中点:快指针走两步,慢指针走一步,最终慢指针指向前半段末尾
  2. 反转后半链表:采用经典三指针法反转链表,时间复杂度 O(n/2)
  3. 孪生和计算:通过双指针并行遍历,比较每个对称节点对的和值
3. 复杂度
指标说明
时间复杂度O(n)遍历链表三次(分割、反转、求和)
空间复杂度O(1)仅使用固定数量的指针变量

三、图解示例

在这里插入图片描述

四、边界条件与扩展

1. 特殊场景验证
  • 最小偶长链表:输入链表[1,2] → 输出3(直接首尾相加)
  • 全相同元素:输入链表[5,5,5,5] → 输出10(每对和均为10)
  • 极值分布:输入链表[0,100000] → 输出100000(边界测试)
2. 多语言实现
# Python实现
class Solution:def pairSum(self, head: ListNode) -> int:# 快慢指针分割slow = fast = headwhile fast.next and fast.next.next:slow = slow.nextfast = fast.next.next# 反转后半部分prev, curr = None, slow.nextslow.next = Nonewhile curr:next_node = curr.nextcurr.next = prevprev, curr = curr, next_node# 计算最大值max_sum = 0p1, p2 = head, prevwhile p1 and p2:max_sum = max(max_sum, p1.val + p2.val)p1, p2 = p1.next, p2.nextreturn max_sum
// Java实现
class Solution {public int pairSum(ListNode head) {// 快慢指针定位中点ListNode slow = head, fast = head;while (fast.next != null && fast.next.next != null) {slow = slow.next;fast = fast.next.next;}// 反转后半链表ListNode prev = null, curr = slow.next;slow.next = null;while (curr != null) {ListNode next = curr.next;curr.next = prev;prev = curr;curr = next;}// 遍历求最大值int maxSum = 0;ListNode p1 = head, p2 = prev;while (p1 != null && p2 != null) {maxSum = Math.max(maxSum, p1.val + p2.val);p1 = p1.next;p2 = p2.next;}return maxSum;}
}

五、总结与扩展

1. 核心创新点
  • 三段式处理:将问题分解为链表分割、反转、求和的独立模块(网页2、4)
  • 空间优化:通过原地反转避免数组存储,实现O(1)空间复杂度
  • 对称访问机制:利用链表反转实现自然对称遍历(网页5)
2. 扩展应用
  • 回文链表检测:结合快慢指针与反转操作(LeetCode 234)
  • 环形链表处理:通过快慢指针检测环的存在(网页1)
  • K个一组反转:将本解法中的反转逻辑扩展为分组处理(LeetCode 25)
3. 工程优化方向
  • 内存预判:根据链表长度选择数组存储或原地反转策略
  • 并发安全:添加原子操作保证多线程环境下的指针安全
  • 缓存优化:利用内存局部性原理优化遍历顺序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/19.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux makefile的一些语法

一、定义变量 1. 变量的基本语法 在 makefile 中&#xff0c;变量的定义和使用非常类似于编程语言中的变量。变量的定义格式&#xff08;最好不要写空格&#xff09;如下&#xff1a; VARIABLE_NAMEvalue 或者 VARIABLE_NAME:value 表示延迟赋值&#xff0c;变量的值在引…

CAN/FD CAN总线配置 最新详解 包含理论+实战(附带源码)

看前须知&#xff1a;本篇文章不会说太多理论性的内容&#xff08;重点在理论结合实践&#xff09;&#xff0c;顾及实操&#xff0c;应用&#xff0c;一切理论内容支撑都是为了后续实际操作进行铺垫&#xff0c;重点在于读者可以看完文章应用。&#xff08;也为节约读者时间&a…

木马学习记录

一句话木马是什么 一句话木马就是仅需要一行代码的木马&#xff0c;很简短且简单&#xff0c;木马的函数将会执行我们发送的命令 如何发送命令&#xff06;发送的命令如何执行? 有三种方式&#xff1a;GET&#xff0c;POST&#xff0c;COOKIE&#xff0c;一句话木马中用$_G…

Linux系统调用编程

一、进程和线程的概念 1.进程 进程是指一个具有独立功能的程序在某个数据集上的一次动态执行过程,它是系统进行资源分配和调度的最小单元。 定义&#xff1a;进程是程序的一次执行实例&#xff0c;拥有独立的地址空间、资源&#xff08;如内存、文件描述符等&#xff09;和系…

PostgreSQL的扩展(extensions)-常用的扩展-pg_dirtyread

PostgreSQL的扩展&#xff08;extensions&#xff09;-常用的扩展-pg_dirtyread pg_dirtyread 是 PostgreSQL 的一个特殊扩展&#xff0c;它允许读取已被删除但尚未被 VACUUM 清理的数据行&#xff0c;是数据恢复的重要工具。 原理&#xff1a; pg_dirtyread 通过直接访问表的…

花卉识别分类系统,Python/resnet18/pytorch

花卉识别分类系统,Python/resnet18/pytorch 基于pytorch训练, resnet18网络&#xff0c;可用于训练其他分类问题&#xff0c;也可自己重新训练 共五种花卉&#xff1a;雏菊&#xff0c;蒲公英&#xff0c;玫瑰&#xff0c;向日葵&#xff0c;郁金香 标价包含GUI源码、数据集…

SQL Server数据库异常-[SqlException (0x80131904): 执行超时已过期] 操作超时问题及数据库日志已满的解决方案

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;获得2024年博客之星荣誉证书&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开发技术&#xff0c…

C++数据排序( 附源码 )

一.冒泡排序 原理:自左向右依次遍历,若相邻两数顺序错误,则交换两数. 这样,每一轮结束后,最大/最小的数就会到最后. Code: #include <iostream> #include <cstdio> using namespace std; const int N1e51; int n,a[N],in; void PrintArray(int a[],int n){for…

MTK-GMS版本国内WIFI受限问题

MTK-GMS版本国内WIFI受限问题解决 文章目录 问题参考资料解决方案方案一 修改配置坑点 方案二 直接修改属性 问题 最近负责ROOM 产品&#xff0c;出现WIFI受限显示&#xff0c;但是网络是通畅的。 GMS 版本&#xff0c;在国外或者国内翻墙网络不会出现WIFI受限显示问题&#…

34、web前端开发之JavaScript(三)

十. DOM操作详解 1、DOM简介 文档对象模型&#xff08;DOM&#xff0c;Document Object Model&#xff09;是JavaScript与网页内容交互的接口。它将HTML文档表示为一种树状结构&#xff08;DOM树&#xff09;&#xff0c;其中每个节点代表文档的一部分&#xff08;例如元素、…

【HCIA】静态综合实验练习笔记

实验拓扑图如下&#xff1a; 实验配置思路如下&#xff1a; 1、网段划分、配置IP地址 2、配置DHCP&#xff0c;使客户端获得ip地址 3、配置静态明细路由&#xff0c;内网全网通 4、配置空接口防环 5、配置优先级&#xff0c;实现选路最佳 6、配置缺省路由&#xff0c;实现公网通…

maven引入项目内本地包方法

最近在写java实现excel转pdf功能&#xff1b; 网上有个包很好用&#xff0c;免费&#xff1a;spire.xls.free-5.3.0.jar。 但是maven打包项目时报错&#xff0c;找不到这个包。 jar包位置如下&#xff1a; 在项目/src/jar/spire.xls.free-5.3.0.jar。 解决方法&#xff1a…