返回

算法实战:LeetCode 24 两两交换链表中的节点

前端

问题背景

链表是一种常见的数据结构,它由一系列彼此相连的节点组成,每个节点包含数据和指向下一个节点的指针。在 LeetCode 24 题中,我们被要求两两交换链表中的节点。也就是说,对于一个包含 n 个节点的链表,我们需要将第 1 个节点和第 2 个节点交换,第 3 个节点和第 4 个节点交换,以此类推,直到链表末尾。

解决方案一:迭代法

迭代法是一种简单而直接的解决方案。我们使用两个指针,分别指向当前节点和下一个节点。然后,我们迭代链表,将当前节点和下一个节点交换。为了保持链表的完整性,我们需要使用额外的指针来记录前一个节点。这样,我们就可以在交换节点后正确更新指针。

def swap_pairs_iterative(head):
  """
  :type head: ListNode
  :rtype: ListNode
  """
  dummy = ListNode(0)
  dummy.next = head

  prev = dummy
  current = head

  while current and current.next:
    next_pair = current.next.next
    second = current.next

    second.next = current
    current.next = next_pair
    prev.next = second

    prev = current
    current = next_pair

  return dummy.next

解决方案二:递归法

递归法也是一种有效的解决方案。我们使用一个递归函数来交换链表中的节点。在递归函数中,我们首先检查链表是否为空或只有一个节点。如果是,则直接返回链表。否则,我们交换当前节点和下一个节点,然后递归交换剩余的链表。

def swap_pairs_recursive(head):
  """
  :type head: ListNode
  :rtype: ListNode
  """
  if not head or not head.next:
    return head

  next_pair = head.next.next
  second = head.next

  second.next = head
  head.next = swap_pairs_recursive(next_pair)

  return second

复杂度分析

两种解决方案的时间复杂度都是 O(n),其中 n 为链表的长度。这是因为我们都需要遍历整个链表。

空间复杂度方面,迭代法需要额外的空间来存储前一个节点的指针,因此空间复杂度为 O(1)。递归法不需要额外的空间来存储前一个节点的指针,但它需要额外的空间来存储递归函数的调用栈,因此空间复杂度为 O(n)。

总结

在本文中,我们探讨了 LeetCode 24 题:两两交换链表中的节点。我们提供了两种清晰易懂的解决方案:迭代法和递归法。我们还分析了这两种解决方案的时间复杂度和空间复杂度。希望本文对您有所帮助。