原文地址:百度一面算法题-合并两个有序链表
题目:给定初始两个有序链表s1、s2,现需将s1和s2合并,并进行排序。
可使用Go中的切片来模拟链表实现相关功能,首先设s1 := []int{1, 3, 5, 7},s2 := []int{2, 4, 6, 8},合并排序后的s3 := []int{1, 2, 3, 4, 5, 6, 7, 8}。
来分析下实现上述代码的思路,首先将s1、s2的第一个元素取出进行比较,用第一个元素较小的切片做最外层的循环,另一个切片做最里层的循环。
循环过程中,第一层循环下直接将第一个元素较小的切片的元素填充进s3,第二层循环是为了查找比第一层循环中的当前元素的值大且比当前元素的下一个元素的值小的元素,将其填充进s3,如此循环,可处理掉s1、s2除最后一个元素外的所有元素,最后将其最后一个元素单独处理就可以了。
代码实现如下:
package main
import "fmt"
func main() {
s1 := []int{1, 3, 5, 7}
s2 := []int{2, 4, 6, 8}
s3 := make([]int, 0)
for i := 0; i < len(s1); i++ {
if i+1 < len(s1) {
s3 = append(s3, s1[i])
}
for j := 0; j < len(s2); j++ {
if i+1 < len(s1) {
if s2[j] > s1[i] && s2[j] < s1[i+1] {
s3 = append(s3, s2[j])
}
}
}
}
if s1[len(s1)-1] < s2[len(s2)-1] {
s3 = append(s3, s1[len(s1)-1])
s3 = append(s3, s2[len(s2)-1])
} else {
s3 = append(s3, s2[len(s2)-1])
s3 = append(s3, s1[len(s1)-1])
}
fmt.Println(s3)
}
运行结果如下:
上述代码并不是最优解,只是当时脑子蒙圈的下意识的方案,还有其它更优秀的方案,欢迎各位批评指正。
至此,本次分享就结束了,后期会慢慢补充。
以上仅为个人观点,不一定准确,能帮到各位那是最好的。
好啦,到这里本文就结束了,喜欢的话就来个三连击吧。
扫码关注公众号,获取更多优质内容。