📌 题目介绍
在一个大小为n且n为偶数的链表中,对于0 <= i <= (n / 2) - 1的i,第i个节点(下标从0开始)的孪生节点为第(n-1-i)个节点 。
- 比方说,
n = 4那么节点0是节点3的孪生节点,节点1是节点2的孪生节点。这是长度为n = 4的链表中所有的孪生节点。
孪生和定义为一个节点和它孪生节点两者值之和。
给你一个长度为偶数的链表的头节点head,请你返回链表的最大孪生和。
💡 核心思路
| 关键点 | 解决方案 |
|---|---|
| 无法随机访问 | 快慢指针找中点 |
| 无法反向遍历 | 反转后半段链表 |
| 计算最大值 | 双指针同时遍历 |
🔑 三步解法
步骤 1:快慢指针找中点
let slow = head, fast = head; while (fast !== null && fast.next !== null) { slow = slow.next; fast = fast.next.next; } // slow 指向后半段起点步骤 2:反转后半段链表
let prev = null, curr = slow; while (curr !== null) { let next = curr.next; curr.next = prev; prev = curr; curr = next; } // prev 指向反转后的头步骤 3:双指针计算最大和
let maxSum = 0; let p1 = head, p2 = prev; while (p2 !== null) { let sum = p1.val + p2.val; maxSum = Math.max(maxSum, sum); p1 = p1.next; p2 = p2.next; } return maxSum;📊 复杂度分析
| 类型 | 复杂度 | 说明 |
|---|---|---|
| 时间 | O(n) | 遍历链表约 1.5 次 |
| 空间 | O(1) | 只使用指针变量 |
🎯 知识点总结
- 快慢指针:找中点/检测环的经典技巧
- 原地反转链表:三指针迭代法
- 双指针遍历:同时处理两段数据结构
- 链表分割思想:将问题拆分为独立子问题
📚 类似题目推荐
| 题目 | 考点 |
|---|---|
| 141. 环形链表 | 快慢指针 |
| 206. 反转链表 | 链表反转 |
| 143. 重排链表 | 中点 + 反转 + 合并 |
💬学习心得:链表题的关键是画图理解指针变化,动手模拟每一步能帮助避免逻辑错误!
完整代码
var pairSum = function(head) { //找到链表中点(快慢指针) let slow = head; //定义快慢指针 let fast = head; while (fast !== null && fast.next !== null){ //确保快指针两步都有路可走 slow = slow.next; //慢指针每次指向下一个节点 fast = fast.next.next; //快指针每次指向下下个节点 } //将后半段链表反转(三指针迭代) let prev = null; let curr = slow; while(curr !== null){ let next = curr.next;// 1. 暂存下一个节点 curr.next = prev; // 2. 翻转指向 prev = curr; // 3. prev 前进到当前节点 curr = next; // 4. curr 前进到下一个节点 } //遍历前后两段,计算最大孪生和(双指针) let maxSum = 0; let p1 = head; let p2 = prev; while (p2 !== null) { // 计算当前孪生和并更新最大值 let currentSum = p1.val + p2.val maxSum = Math.max(maxSum,currentSum) // 移动两个指针 p1 = p1.next p2 = p2.next } return maxSum; };PS:该总结由Leet生成