题目链接
链表最大孪生和
题目描述
注意点
- 链表的节点数目是 [2, 100000] 中的 偶数
- 1 <= Node.val <= 100000
- 第 i 个节点(下标从 0 开始)的孪生节点为第 (n-1-i) 个节点
解答思路
- 首先想到的是使用双端队列按顺序存储链表中每个节点的值,然后每次弹出链表首部和尾部的值计算孪生和,找到最大孪生和即可
- 参照题解可以使用双指针找到链表的中间节点,寻找中间节点的同时可以反转前半部分链表,在找到中间节点时,前半部分链表全部反转,此时再按顺序遍历前半部分链表对应位置节点值与后半部分链表对应位置节点值的和就是孪生和,找到最大孪生和即可
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public int pairSum(ListNode head) {
int res = 0;
// 将链表对半分,反转前半部分链表
ListNode slow = head;
ListNode quick = head;
ListNode prevNode = null;
while (quick != null && quick.next != null) {
ListNode currNode = slow;
slow = slow.next;
quick = quick.next.next;
currNode.next = prevNode;
prevNode = currNode;
}
// 前半部分反转后首节点为prevNode,后半部分首节点为slow
while (slow != null) {
res = Math.max(res, slow.val + prevNode.val);
slow = slow.next;
prevNode = prevNode.next;
}
return res;
}
}
关键点
- 双指针找到中间节点
- 反转链表的方法