python-leetcode-链表最大孪生和

2130. 链表最大孪生和 - 力扣(LeetCode)

可以使用双指针的方式来解决这个问题。具体步骤如下:

解题思路:

  1. 找到链表的中点:使用快慢指针,快指针一次走两步,慢指针一次走一步,当快指针到达链表末尾时,慢指针正好到达中点。
  2. 反转链表的后半部分:从中点开始,将后半部分链表进行反转
  3. 计算最大孪生和
    • 现在前半部分链表的顺序不变,后半部分链表是反转后的顺序。
    • 遍历前半部分和后半部分,计算孪生节点的和,维护最大值。

代码实现:

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)

这种方法利用了链表的特性,并且优化了空间复杂度,使得整体效率较高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值