返回
算法实战:LeetCode 24 两两交换链表中的节点
前端
2024-01-20 12:35:58
问题背景
链表是一种常见的数据结构,它由一系列彼此相连的节点组成,每个节点包含数据和指向下一个节点的指针。在 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 题:两两交换链表中的节点。我们提供了两种清晰易懂的解决方案:迭代法和递归法。我们还分析了这两种解决方案的时间复杂度和空间复杂度。希望本文对您有所帮助。