


可以使用双指针和栈的方式来解决这个问题。具体步骤如下:
解题思路:
- 找到链表的中点:使用快慢指针,快指针一次走两步,慢指针一次走一步,当快指针到达链表末尾时,慢指针正好到达中点。
- 反转链表的后半部分:从中点开始,将后半部分链表进行反转。
- 计算最大孪生和:
- 现在前半部分链表的顺序不变,后半部分链表是反转后的顺序。
- 遍历前半部分和后半部分,计算孪生节点的和,维护最大值。
代码实现:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def pairSum(self, head: ListNode) -> int:
# 使用快慢指针找到链表的中点
slow, fast = head, head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
# 反转后半部分链表
prev, curr = None, slow
while curr:
next_temp = curr.next
curr.next = prev
prev = curr
curr = next_temp
# 计算孪生节点的最大和
max_sum = 0
first, second = head, prev
while second:
max_sum = max(max_sum, first.val + second.val)
first = first.next
second = second.next
return max_sum
复杂度分析:
- 寻找中点:O(n)
- 反转后半部分链表:O(n)
- 计算最大孪生和:O(n)
- 总时间复杂度:O(n)
- 空间复杂度:O(1)(只使用了几个额外指针)
示例:
输入:
head = [4,2,2,3]
输出:
7 (因为 4+3=7, 2+2=4,最大的是7)
这种方法利用了链表的特性,并且优化了空间复杂度,使得整体效率较高。
1149

被折叠的 条评论
为什么被折叠?



