2130. Maximum Twin Sum of A Linked List #
题目 #
在一个大小为 n
且 n
为 偶数 的链表中,对于 0 <= i <= (n / 2) - 1
的 i
,第 i
个节点(下标从 0 开始)的孪生节点为第 (n-1-i)
个节点 。
- 比方说,
n = 4
那么节点0
是节点3
的孪生节点,节点1
是节点2
的孪生节点。这是长度为n = 4
的链表中所有的孪生节点。
孪生和 定义为一个节点和它孪生节点两者值之和。
给你一个长度为偶数的链表的头节点 head
,请你返回链表的 最大孪生和 。
思路 #
代码 #
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; }
}
lass Solution {
/** 定位链表中心节点 */
public ListNode findMiddle(ListNode head) {
ListNode sentinel = new ListNode(-1, head);
ListNode slow = sentinel, fast = sentinel;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
ListNode result = slow.next;
slow.next = null;
return result;
}
/** 翻转链表 */
public ListNode reverseList(ListNode head) {
ListNode prev = null, cur = head, temp = head.next;
while (cur != null) {
cur.next = prev;
prev = cur;
cur = temp;
if (temp != null) temp = temp.next;
}
return prev;
}
public int pairSum(ListNode head) {
ListNode middle = findMiddle(head);
ListNode tail = reverseList(middle);
int result = head.val + tail.val;
ListNode ptrHead = head.next, ptrTail = tail.next;
while (ptrHead != null && ptrTail != null) {
if (ptrHead.val + ptrTail.val > result) result = ptrHead.val + ptrTail.val;
ptrHead = ptrHead.next;
ptrTail = ptrTail.next;
}
return result;
}
}