2130. Maximum Twin Sum of a Linked List

2130. Maximum Twin Sum of A Linked List #

题目 #

在一个大小为 nn偶数 的链表中,对于 0 <= i <= (n / 2) - 1i ,第 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;
    }
}