题目
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
进阶:
你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?
示例1
输入:head = [4,2,1,3]
输出:[1,2,3,4]
示例2
输入:head = [-1,5,3,4,0]
输出:[-1,0,3,4,5]
示例3
输入:head = []
输出:[]
代码(第一种先用了归并排序)
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func sortList(head *ListNode) *ListNode {
if head==nil||head.Next==nil{ //只有一个节点,不需要排序
return head
}
/*设置快慢指针*/
slow:=head
fast:=head.Next //注意多走一步,是为了让slow的next指向中间之前,如果不多走,则是slow=中间节点
for fast!=nil&&fast.Next!=nil{
fast=fast.Next.Next
slow=slow.Next
}
r:=sortList(slow.Next)
slow.Next=nil//从中间切断
l:=sortList(head)
prev:=&ListNode{Next: nil}
return merage(prev,l,r)
}
/*这里负责返回合并的链表*/
func merage(prev,l,r *ListNode)*ListNode{
tmp:=prev//哨兵节点
for l!=nil&&r!=nil{
if l.Val<r.Val{
tmp.Next=l
l=l.Next
}else{
tmp.Next=r
r=r.Next
}
tmp=tmp.Next
}
if l!=nil{//说明l长
tmp.Next=l
}
if r!=nil{//说明r长
tmp.Next=r
}
return prev.Next
}