【golang】leetcode初级-环形链表&二叉树的最大深度

wric

第一题 环形链表

题目信息

image.png

解题思路

首先还是考虑最暴力的解法
由示例1可知,有两个节点同时指向第二个节点,从而在单链表的基础上形成了闭环。即pos0和pos3拥有着相同的next指针
由示例2可知,对于指向头节点的情况,有必要加入哑节点辅助比较pos1的next指针
所以我们只要比对一遍所有节点的next指针,找到指向相同的节点即可
然而很明显,该思路的复杂度为O(n^2),一般情况下没有写出来的必要。

时间复杂度高的原因主要是因为对比的过程过于麻烦,有太多重复性的操作。
对此再加入哈希表的概念优化一下,使用哈希表来存储所有已经访问过的节点
image.png

代码

func hasCycle(head *ListNode) bool {
    seen := map[*ListNode]struct{}{}
    for head != nil {
        if _, ok := seen[head]; ok {
            return true
        }
        seen[head] = struct{}{}
        head = head.Next
    }
    return false
}

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/linked-list-cycle/solution/huan-xing-lian-biao-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

关于代码的map定义
image.png

复杂度分析

时间复杂度:O(N),其中 N 是链表中的节点数。最坏情况下我们需要遍历每个节点一次。

空间复杂度:O(N),其中 N 是链表中的节点数。主要为哈希表的开销,最坏情况下我们需要将每个节点插入到哈希表中一次。

另一种思路

快慢指针,永远滴神
image.png

func hasCycle(head *ListNode) bool {
    if head == nil || head.Next == nil {
        return false
    }
    slow, fast := head, head.Next
    for fast != slow {
        if fast == nil || fast.Next == nil {
            return false
        }
        slow = slow.Next
        fast = fast.Next.Next
    }
    return true
}

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/linked-list-cycle/solution/huan-xing-lian-biao-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

时间复杂度:O(N),其中 N 是链表中的节点数。

当链表中不存在环时,快指针将先于慢指针到达链表尾部,链表中每个节点至多被访问两次。

当链表中存在环时,每一轮移动后,快慢指针的距离将减小一。而初始距离为环的长度,因此至多移动 N 轮。

空间复杂度:O(1)。我们只使用了两个指针的额外空间。
这很酷
image.png

第二题 二叉树的最大深度

题目信息

image.png

解题思路

遍历一遍树的所有节点并记录他的深度即可
常见的树的遍历方法即为广度优先搜索和深度优先搜索
本题求解为二叉树的深度3,深搜显然更为简洁
image.png

代码

func maxDepth(root *TreeNode) int {

if root == nil {
    return 0
}
return max(maxDepth(root.Left), maxDepth(root.Right)) + 1

}

func max(a, b int) int {

if a > b {
    return a
}
return b

}

复杂度分析

时间复杂度:O(n),其中 n 为二叉树节点的个数。每个节点在递归中只被遍历一次。

空间复杂度:O(height),其中 height 表示二叉树的高度。递归函数需要栈空间,而栈空间取决于递归的深度,因此空间复杂度等价于二叉树的高度。

阅读 434
10 声望
3 粉丝
0 条评论
10 声望
3 粉丝
文章目录
宣传栏