写点什么

两种解法搞定 Swap Nodes in Pairs 算法题

作者:EquatorCoco
  • 2024-04-19
    福建
  • 本文字数:1079 字

    阅读完需:约 4 分钟

最近还是很喜欢用 golang 来刷算法题,更接近通用算法,也没有像动态脚本语言那些语法糖,真正靠实力去解决问题。下面这道题很有趣,也是一道链表题目,具体如下:



24. Swap Nodes in PairsSolvedMediumTopicsCompaniesGiven a linked list, swap every two adjacent nodes and return its head. You must solve the problem without modifying the values in the list's nodes (i.e., only nodes themselves may be changed.) 
Example 1:

Input: head = [1,2,3,4]Output: [2,1,4,3]Example 2:
Input: head = []Output: []Example 3:
Input: head = [1]Output: [1]
Constraints:
The number of nodes in the list is in the range [0, 100].0 <= Node.val <= 100
复制代码


快速思考了一下,想到这个交换节点的事儿可以用递归去实现,通过三个指针 prev, current, next 不断移动,实现相邻节点交换,代码如下:

/** * Definition for singly-linked list. * type ListNode struct { *     Val int *     Next *ListNode * } */func swapPairs(head *ListNode) *ListNode {		if head == nil || head.Next == nil {		return head	}		if head.Next.Next == nil {		next := head.Next		head.Next = nil		next.Next = head        head = next
return head }
prev, cur, nxt := head, head.Next, head.Next.Next cur.Next = prev head = cur prev.Next = swapPairs(nxt)
return head}
复制代码


递归虽然好,但是也会有一些性能上的担忧,毕竟递归调用太深,可能会引发堆栈溢出。后面再仔细推敲了一下,完全可以用 2 个指针不断进行交换,可以不用递归。这里还是要用一个 dump 节点来方便的保存修改后的链表,具体如下:

/** * Definition for singly-linked list. * type ListNode struct { *     Val int *     Next *ListNode * } */func swapPairs(head *ListNode) *ListNode {		dump := &ListNode{Val: 0}	dump.Next = head	prevNode := dump	currentNode := head
for currentNode != nil && currentNode.Next != nil { prevNode.Next = currentNode.Next currentNode.Next = currentNode.Next.Next prevNode.Next.Next = currentNode prevNode = currentNode currentNode = currentNode.Next }
return dump.Next}
复制代码


最终它们的时间复杂度是 O(N),空间复杂度 O(1),都非常棒。如果是你,你更喜欢哪种解法呢?欢迎在评论区留言交流。


文章转载自:freephp

原文链接:https://www.cnblogs.com/freephp/p/18144636

体验地址:http://www.jnpfsoft.com/?from=infoq

用户头像

EquatorCoco

关注

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
两种解法搞定Swap Nodes in Pairs算法题_算法_EquatorCoco_InfoQ写作社区