返回

LeetCode 2181 合并零节点间的节点

后端

在竞争激烈的编程世界中,算法和数据结构是必不可少的工具。LeetCode 提供了一个绝佳的平台,让程序员可以磨练他们的技能并解决各种具有挑战性的问题。其中一个引人注目的问题是 LeetCode 2181:合并零节点间的节点。

问题

给定一个以 0 结尾的链表,将 0 节点之间的所有节点合并为一个节点。重复此过程,直到你得到一个合并后的链表,其中不包含任何 0 节点。返回合并后的链表。

例如:

输入:head = [0,1,0,2,1,0,3,4,0]
输出:[1,3,4]

解题思路

这个问题可以采用多种方法解决,这里介绍两种不同的方法:

  • 循环法 :这种方法使用循环来遍历链表,并记录当前的非零节点和要合并的节点。当遇到一个 0 节点时,将当前的非零节点与要合并的节点连接起来,并更新要合并的节点。重复此过程,直到遍历完整个链表。
def mergeNodes(head):
    """
    :type head: ListNode
    :rtype: ListNode
    """
    dummy = ListNode(0)
    prev = dummy
    curr = head

    while curr:
        if curr.val == 0:
            prev.next = curr
            prev = prev.next
        else:
            prev.val += curr.val
        curr = curr.next

    prev.next = None
    return dummy.next
  • 递归法 :这种方法使用递归来解决问题。在递归函数中,先将链表分为两部分:从头节点到第一个 0 节点,以及从第一个 0 节点之后的节点。然后,将这两个部分合并,并返回合并后的链表。重复此过程,直到整个链表都被合并。
def mergeNodes(head):
    """
    :type head: ListNode
    :rtype: ListNode
    """
    if not head or not head.next:
        return head

    curr = head
    while curr.next and curr.next.val != 0:
        curr = curr.next

    newHead = ListNode(0)
    newHead.next = mergeNodes(curr.next.next)
    newHead.val = sum(node.val for node in curr.next)

    return newHead

复杂度分析

  • 时间复杂度

    • 循环法:O(n),其中 n 是链表的长度。
    • 递归法:O(n),其中 n 是链表的长度。
  • 空间复杂度

    • 循环法:O(1),因为我们不需要额外的空间来存储数据。
    • 递归法:O(n),因为递归函数需要额外的空间来存储调用栈。

总结

LeetCode 2181:合并零节点间的节点是一个有趣的算法问题,可以帮助程序员提高他们的编程技能。通过两种不同的方法解决这个问题,我们可以看到不同的方法可以导致不同的实现方式,并可以根据不同的情况选择合适的方法。希望这篇文章对您有所帮助,如果您有任何问题,请随时评论。