链表最大孪生和

39 阅读1分钟
/**
 * 在一个大小为 n 且 n 为 偶数 的链表中,对于 0 <= i <= (n / 2) - 1 的 i ,第 i 个节点(下标从 0 开始)的孪生节点为第 (n-1-i) 个节点 。
 *
 * 比方说,n = 4 那么节点 0 是节点 3 的孪生节点,节点 1 是节点 2 的孪生节点。这是长度为 n = 4 的链表中所有的孪生节点。
 * 孪生和 定义为一个节点和它孪生节点两者值之和。
 *
 * 给你一个长度为偶数的链表的头节点 head ,请你返回链表的 最大孪生和 。
 * https://leetcode.cn/problems/maximum-twin-sum-of-a-linked-list/
 */
public class PairSum {

    /**
     * 题解:
     *  1. 先使用快慢指针获取到后2/n的上一个节点;
     *  2. 把后半部分直接反转;
     *  3. 将i 和i + 2/n位置节点的数据相加获取到最大的孪生和.
     * @param head
     * @return
     */
    public int pairSum(ListNode head) {
        ListNode slow = head;
        ListNode fast = head;
        while (fast.next != null && fast.next.next!= null) {
            fast = fast.next.next;
            slow = slow.next;
        }
        ListNode oddListNode = slow.next;
        slow.next = null;

        ListNode cur = oddListNode;
        ListNode prev = null;
        while(cur != null){
            ListNode next = cur.next;
            cur.next = prev;
            prev = cur;
            cur = next;
        }

        int res = 0;

        while(head != null){
            res = Math.max(prev.val+head.val,res);
            head = head.next;
            prev = prev.next;
        }
        return res;
    }

    private class ListNode {
        ListNode next;
        int val;
    }
}