Golang每日一练(leetDay0007)
创始人
2025-05-29 10:12:00
0次

目录

19. 删除链表的倒数第 N 个结点 Remove-nth-node-from-end-of-list  ★★

20. 有效的括号 Valid Parentheses  ★

21. 合并两个有序链表 Mmerge-two-sorted-lists  ★

🌟 每日一练刷题专栏 🌟

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


19. 删除链表的倒数第 N 个结点 Remove-nth-node-from-end-of-list

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

示例 1:

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

示例 2:

输入:head = [1], n = 1
输出:[]

示例 3:

输入:head = [1,2], n = 1
输出:[1]

提示:

  • 链表中结点的数目为 sz
  • 1 <= sz <= 30
  • 0 <= Node.val <= 100
  • 1 <= n <= sz

进阶:你能尝试使用一趟扫描实现吗?

代码:

package mainimport ("fmt"
)type ListNode struct {data intnext *ListNode
}func (head *ListNode) build(list []int) {for i := len(list) - 1; i >= 0; i-- {p := &ListNode{data: list[i]}p.next = head.nexthead.next = p}
}func (head *ListNode) travel() {for p := head.next; p != nil; p = p.next {fmt.Print(p.data)if p.next != nil {fmt.Print("->")}}fmt.Println("")
}func removeNthFromEnd(head *ListNode, n int) *ListNode {var fast, slow *ListNodefast = headslow = headfor i := 0; i < n; i++ {fast = fast.next}if fast == nil {head = head.nextreturn head}for fast.next != nil {fast = fast.nextslow = slow.next}slow.next = slow.next.nextreturn head
}func main() {nums := []int{1, 2, 3, 4, 5}head := &ListNode{}head.build(nums)head.travel()head = removeNthFromEnd(head, 2)head.travel()head = &ListNode{}head.build([]int{1})head.travel()head = removeNthFromEnd(head, 1)head.travel()head = &ListNode{}head.build([]int{1, 2})head.travel()head = removeNthFromEnd(head, 1)head.travel()}

输出:

1->2->3->4->5
1->2->3->5

1

1->2
1

其他解法:

package mainimport ("fmt"
)type ListNode struct {data intnext *ListNode
}func (head *ListNode) build(list []int) {for i := len(list) - 1; i >= 0; i-- {p := &ListNode{data: list[i]}p.next = head.nexthead.next = p}
}func (head *ListNode) travel() {for p := head.next; p != nil; p = p.next {fmt.Print(p.data)if p.next != nil {fmt.Print("->")}}fmt.Println("")
}func removeNthFromEnd(head *ListNode, n int) *ListNode {if head == nil {return nil}len := countBackwards(head, n)if n >= len {return head.next}return head
}func countBackwards(p *ListNode, n int) int {if p.next == nil {return 1}res := countBackwards(p.next, n) + 1if res == n+1 {if n == 1 {p.next = nil} else {p.next = p.next.next}}return res
}func main() {nums := []int{1, 2, 3, 4, 5}head := &ListNode{}head.build(nums)head.travel()head = removeNthFromEnd(head, 2)head.travel()head = &ListNode{}head.build([]int{1})head.travel()head = removeNthFromEnd(head, 1)head.travel()head = &ListNode{}head.build([]int{1, 2})head.travel()head = removeNthFromEnd(head, 1)head.travel()}

20. 有效的括号 Valid Parentheses

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

示例 1:

输入:s = "()"
输出:true

示例 2:

输入:s = "()[]{}"
输出:true

示例 3:

输入:s = "(]"
输出:false

示例 4:

输入:s = "([)]"
输出:false

示例 5:

输入:s = "{[]}"
输出:true

提示:

  • 1 <= s.length <= 10^4
  • s 仅由括号 '()[]{}' 组成

代码:

package mainimport ("fmt"
)func isValid(s string) bool {stack := make([]byte, 0)for _, ch := range s {switch ch {case '(':fallthroughcase '[':fallthroughcase '{':stack = append(stack, byte(ch))case ')':if len(stack) > 0 && stack[len(stack)-1] == '(' {stack = stack[:len(stack)-1]} else {return false}case ']':if len(stack) > 0 && stack[len(stack)-1] == '[' {stack = stack[:len(stack)-1]} else {return false}case '}':if len(stack) > 0 && stack[len(stack)-1] == '{' {stack = stack[:len(stack)-1]} else {return false}}}return len(stack) == 0
}func main() {fmt.Println(isValid("()"))fmt.Println(isValid("()[]{}"))fmt.Println(isValid("(]"))fmt.Println(isValid("([)]"))fmt.Println(isValid("{()}"))}

输出:

true
true
false
false
true


21. 合并两个有序链表 Mmerge-two-sorted-lists

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

示例 1:

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

示例 2:

输入:l1 = [], l2 = []
输出:[]

示例 3:

输入:l1 = [], l2 = [0]
输出:[0]

提示:

  • 两个链表的节点数目范围是 [0, 50]
  • -100 <= Node.val <= 100
  • l1 和 l2 均按 非递减顺序 排列

代码:

package mainimport ("fmt"
)type ListNode struct {data intnext *ListNode
}func (head *ListNode) build(list []int) {for i := len(list) - 1; i >= 0; i-- {p := &ListNode{data: list[i]}p.next = head.nexthead.next = p}
}func (head *ListNode) travel() {for p := head.next; p != nil; p = p.next {fmt.Print(p.data)if p.next != nil {fmt.Print("->")}}fmt.Println("")
}func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {res := &ListNode{}p := resfor l1 != nil && l2 != nil {if l1.data < l2.data {p.next = l1l1 = l1.next} else {p.next = l2l2 = l2.next}p = p.next}if l1 != nil {p.next = l1} else {p.next = l2}return res.next
}func main() {nums1 := []int{1, 2, 4}nums2 := []int{1, 3, 4}l1 := &ListNode{}l2 := &ListNode{}l1.build(nums1)l2.build(nums2)l1.travel()l2.travel()result := mergeTwoLists(l1, l2).nextresult.travel()}

输出:

1->2->4
1->3->4
1->1->2->3->4->4

递归法:

package mainimport ("fmt"
)type ListNode struct {data intnext *ListNode
}func (head *ListNode) build(list []int) {for i := len(list) - 1; i >= 0; i-- {p := &ListNode{data: list[i]}p.next = head.nexthead.next = p}
}func (head *ListNode) travel() {for p := head.next; p != nil; p = p.next {fmt.Print(p.data)if p.next != nil {fmt.Print("->")}}fmt.Println("")
}func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {if l1 == nil {return l2}if l2 == nil {return l1}if l1.data < l2.data {l1.next = mergeTwoLists(l1.next, l2)return l1}l2.next = mergeTwoLists(l1, l2.next)return l2
}func main() {n1 := []int{1, 2, 4}n2 := []int{1, 3, 4}l1 := &ListNode{}l2 := &ListNode{}l1.build(n1)l2.build(n2)l1.travel()l2.travel()result := mergeTwoLists(l1, l2).nextresult.travel()}

🌟 每日一练刷题专栏 🌟

✨ 持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

✎ 评论,你的意见是我进步的财富!  

​

Golang每日一练 专栏

​

Python每日一练 专栏

​

C/C++每日一练 专栏

​

Java每日一练 专栏

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...