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

解析
前置题目:
LeetCode 分类刷题:234. 回文链表
思路:
- 找到中间第二个节点
- 反转后半段
- 分别遍历两段,更新最大孪生和
答案
/*** Definition for singly-linked list.* function ListNode(val, next) {* this.val = (val===undefined ? 0 : val)* this.next = (next===undefined ? null : next)* }*/
/*** @param {ListNode} head* @return {number}*/
function middleNode(head) {let slow = head;let fast = head;while(fast) {slow = slow.next;fast = fast.next.next;}return slow;
}
function reverseList(head) {let pre = null;let cur = head;while(cur) {const nxt = cur.next;cur.next = pre;pre = cur;cur = nxt;}return pre;
}
var pairSum = function(head) {// 找到中间第二个节点const mid = middleNode(head);// 反转后半段let head2 = reverseList(mid);// 分别遍历两段,更新最大孪生和let maxVal = 0;while(head2) {maxVal = Math.max(maxVal, head.val + head2.val);head = head.next;head2 = head2.next;}return maxVal;
};
复杂度分析
时间复杂度:O(n),快慢指针找中点和反转链表都是线性操作,遍历计算最大孪生和也是线性。
空间复杂度:O(1),原地修改链表结构,没有额外空间。
