2021-03-16:手写代码:单链表归并排序。
福大大答案2021-03-16:
获取链表中点,然后按中点分成两个链表。递归两个链表。合并两个链表。
代码用golang编写,代码如下:
包装主体
导入“fmt”
func main(){ 0
//head :=ListNode { val : 4 }
//头。下一个=列表节点{Val: 2}
//头。下一个。下一个=列表节点{Val: 1}
//头。下一个,下一个,下一个
head :=ListNode{Val: -1}
头部。下一个=列表节点{Val: 5}
头部。下一个。下一个=列表节点{Val: 3}
头部。下一个,下一个,下一个
头部。下一个。下一个。下一个。下一个=列表节点{Val: 0}
printlnLinkNodeList(标题)
head=合并排序(负责人)
printlnLinkNodeList(标题)
}
//单链表的定义。
类型列表节点结构(
Val int
下一个*列表节点
}
//链表打印
func printlnLinkNodeList(head * ListNode){ 0
cur :=头部
为了cur!=零
fmt .打印(曲线瓦尔,' t ')
cur=cur .然后
}
fmt .Println()
}
//归并排序
func合并排序(head * ListNode)* ListNode {
如果head==nil || head .下一个==零
返回头
}
ret :=过程(头)
返回浸水使柔软
}
//递归头儿不可能为空
功能进程(标题*列表节点)*列表节点{
//如果只有一个节点,直接返回
如果头部。下一个==零
返回头
}
//获取中点
mid :=getMid(head)
midNext :=mid .然后
//按中点拆分链表
中间。下一个=零
//递归
左:=进程(头)
右:=进程(midNext)
//合并
返回合并(左,右)
}
//找中点头儿一定不为空
func getMid(head * ListNode)* ListNode {
fast :=head
慢速:=头部
为了快速。下一个!=零快。下一个,下一个!=零
快=快。下一个,下一个
慢=慢。然后
}
缓慢返回
}
//合并,左侧和正确一定都不为空
func merge(左*列表节点,右*列表节点)*列表节点{
preAns :=列表节点{}
preAnsEnd :=preAns
向左!=零右!=零
如果离开瓦尔=右。瓦尔
预发送。下一个=左边
左=左。然后
} else {
预发送。下一个=右
右=右。然后
}
预发送=预发送.然后
}
if left==nil {
预发送。下一个=右
} else {
预发送。下一个=左边
}
返回传教士.然后
}执行结果如下:
***
[力扣148.排序链表](https://leet代码-cn。com/问题/排序列表/
[评论】(https://用户。qzone。QQ。com/3182319461/blog/1615849143)