经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
两种解法搞定Swap Nodes in Pairs算法题
来源:cnblogs  作者:freephp  时间:2024/4/19 8:55:21  对本文有异议

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

  1. 24. Swap Nodes in Pairs
  2. Solved
  3. Medium
  4. Topics
  5. Companies
  6. Given 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.)
  7. Example 1:
  8. Input: head = [1,2,3,4]
  9. Output: [2,1,4,3]
  10. Example 2:
  11. Input: head = []
  12. Output: []
  13. Example 3:
  14. Input: head = [1]
  15. Output: [1]
  16. Constraints:
  17. The number of nodes in the list is in the range [0, 100].
  18. 0 <= Node.val <= 100

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

  1. /**
  2. * Definition for singly-linked list.
  3. * type ListNode struct {
  4. * Val int
  5. * Next *ListNode
  6. * }
  7. */
  8. func swapPairs(head *ListNode) *ListNode {
  9. if head == nil || head.Next == nil {
  10. return head
  11. }
  12. if head.Next.Next == nil {
  13. next := head.Next
  14. head.Next = nil
  15. next.Next = head
  16. head = next
  17. return head
  18. }
  19. prev, cur, nxt := head, head.Next, head.Next.Next
  20. cur.Next = prev
  21. head = cur
  22. prev.Next = swapPairs(nxt)
  23. return head
  24. }

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

  1. /**
  2. * Definition for singly-linked list.
  3. * type ListNode struct {
  4. * Val int
  5. * Next *ListNode
  6. * }
  7. */
  8. func swapPairs(head *ListNode) *ListNode {
  9. dump := &ListNode{Val: 0}
  10. dump.Next = head
  11. prevNode := dump
  12. currentNode := head
  13. for currentNode != nil && currentNode.Next != nil {
  14. prevNode.Next = currentNode.Next
  15. currentNode.Next = currentNode.Next.Next
  16. prevNode.Next.Next = currentNode
  17. prevNode = currentNode
  18. currentNode = currentNode.Next
  19. }
  20. return dump.Next
  21. }

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

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号