From f910e9af9038b21d8785f332743d51b20ffffede Mon Sep 17 00:00:00 2001 From: Stormborn Date: Sun, 13 Aug 2023 22:33:19 +0300 Subject: [PATCH] Create: 2130-maximum-twin-sum-of-a-linked-list.go --- go/2130-maximum-twin-sum-of-a-linked-list.go | 51 ++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 go/2130-maximum-twin-sum-of-a-linked-list.go diff --git a/go/2130-maximum-twin-sum-of-a-linked-list.go b/go/2130-maximum-twin-sum-of-a-linked-list.go new file mode 100644 index 000000000..c038d7512 --- /dev/null +++ b/go/2130-maximum-twin-sum-of-a-linked-list.go @@ -0,0 +1,51 @@ +/** + * Definition for singly-linked list. + * type ListNode struct { + * Val int + * Next *ListNode + * } + */ +func pairSum(head *ListNode) int { + // find mid of a list + slow := head + fast := head.Next + for fast != nil && fast.Next != nil { + slow = slow.Next + fast = fast.Next.Next + } + + // reverse links in 2nd half + second := reverse(slow.Next) + // split into 2 lists + slow.Next = nil + + // traverse two lists with pointers and compare twin sum + first := head + var maxSum int + for first != nil && second != nil { + maxSum = max(maxSum, first.Val+second.Val) + first = first.Next + second = second.Next + } + return maxSum +} + +func reverse(node *ListNode) *ListNode { + var curr, prev *ListNode = node, nil + for curr != nil { + tmp := curr.Next + curr.Next = prev + prev = curr + curr = tmp + } + return prev +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} +//Time: O(n) +//Space: O(1)