目录
19. 删除链表的倒数第 N 个结点 Remove-nth-node-from-end-of-list ★★
20. 有效的括号 Valid Parentheses ★
21. 合并两个有序链表 Mmerge-two-sorted-lists ★
🌟 每日一练刷题专栏 🌟
Golang每日一练 专栏
Python每日一练 专栏
C/C++每日一练 专栏
Java每日一练 专栏
给你一个链表,删除链表的倒数第 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()}
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
示例 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
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 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每日一练 专栏 |