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


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

    24. Swap Nodes in Pairs
    Solved
    Medium
    Topics
    Companies
    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.)
     
    
    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),都非常棒。如果是你,你更喜欢哪种解法呢?欢迎在评论区留言交流。

  • 相关阅读:
    java毕业设计电商项目mybatis+源码+调试部署+系统+数据库+lw
    WSN final fighting 12.05
    马上金九银十了,简历该准备起来了,看这里
    GBase 8c V3.0.0数据类型——序列函数
    SpringMVC常用注解总结
    【深入理解Kotlin协程】lifecycleScope源码追踪扒皮
    SOFA Weekly|Go 代码城市、本周 Contributor & QA
    面进百度,被这份阿里大能开源的“全彩版图解 HTTP 手册”折服了,要不怎么说还得是权威啊
    2013年11月10日 Go生态洞察:Go语言四周年回顾
    神经网络——循环神经网络(RNN)
  • 原文地址:https://www.cnblogs.com/freephp/p/18144636