「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战」
生命不息,学习不止
题外话
大年初四啦,晚上八点大家就可以看冬奥会的开幕式了,我想去鸟巢现场看(但是我没有钱),话说朱广权老师已经不配拥有真人手语老师了嘛,只能让人工智能和他配合了嘛,真是难为了以前的手语老师了!
废话不多说,上货
LeetcCode-21
21. 合并两个有序链表
题目如下:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例图如下
示例 2:
输入: l1 = [], l2 = []
输出: []
示例 3:
输入: l1 = [], l2 = [0]
输出: [0]
算法实现思路
这是一道简单难度的题,不是很难,主要考察的是对于链表结构的熟悉程度。
为两个链表都是升序链表,我们只需要采用一个指针遍历即可,当指针到达了一个链表的结尾,另一个链表未到达结尾,就意味着另一个链表的剩余数据均大于走到结尾链表的数据。
go实现算法
type ListNode struct {
Val int
Next *ListNode
}
func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
list := &ListNode{}
pre := list
for list1 != nil || list2 != nil {
if list1 != nil && list2 != nil {
if list1.Val > list2.Val {
pre.Next = list2
list2 = list2.Next
} else {
pre.Next = list1
list1 = list1.Next
}
pre = pre.Next
} else {
pre.Next = If(list1 == nil, list2, list1)
break
}
}
return list.Next
}
//仿写三元运算符
func If(condition bool, trueVal, falseVal *ListNode) *ListNode {
if condition {
return trueVal
} else {
return falseVal
}
}
进步越来越明显了嗷,虽然只是一道简单难度,但也是可以小小的骄傲一下滴
go结构体的创建
上面的算法实现可以看到,链表结构的实现是手动实现的,因为go中没有内置链表对象,但其实在go中不叫对象,叫结构体。
go中定义结构体也是较为简单的,结构体定义需要使用 type 和 struct 关键字。
type设定了结构体的名称
struct 语句定义一个新的数据类型
结构体中可以有多个成员变量或是结构体,统称成员,结构体的格式如下。
type name struct {
member1 type
member2 type
...
memberN type
}
算法中实现了一个链表的结构体
type ListNode struct {
Val int //值
Next *ListNode //链接的下一个节点,指针地址形式
}
go结构体的声明
这里就说说常用的三种声明结构体的方式
第一种方式是使用T{}方式,这种方式声明的结果为值类型,仍以结构体ListNode为例,声明方式入下
stucname:= ListNode{}
第二种方式是使用内置函数new(),这种方式声明的结果为指针类型,声明方式入下
stucname:= new(ListNode)
第三种就是算法实现中使用的&方式,结果为指针类型
stucname:= &ListNode{}
第一种和第三种方式均支持初始化,初始化方式如下
stucname := &ListNode{1,LiotNode2}
stucname := ListNode{1,LiotNode2}
仍然一种是值类型,一种是指针类型
关于go没有三元运算符这件事
有写兄弟已经发现,我在算法的实现中仿写了三元运算符,为什么要仿写呢,因为go不支持三元运算符,仍和没有整数型Math.max()一样,开发者认为这些的实现很简单,自己实现就可以了,不要影响go的简洁性
我不理解,我是真的不理解……
你以为结束了
小问题:又要搞一个新的题了,惊不惊喜,意不意外,就这个吧 1114. 按序打印,是不是跳跃有点大,但是问题不大
下一篇就讲,敬请期待
大家看完发现有什么错误,写在下面吧!跟我黑虎阿福比划比划!