题解 | #单链表的排序#
单链表的排序
https://www.nowcoder.com/practice/f23604257af94d939848729b1a5cda08
package main
import . "nc_tools"
/*
* type ListNode struct{
* Val int
* Next *ListNode
* }
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类 the head node
* @return ListNode类
*/
func sortInList( head *ListNode ) *ListNode {
// write code here
if head == nil || head.Next == nil { //终止条件,空或者1个
return head
}
var left, mid, fast *ListNode //利用快慢指针,2被速度,所以快指针结束时,慢指针跑一半,left指针用于断开链表
fast = head
mid = head
for fast != nil && fast.Next != nil { //空或者下个为空则终止
if mid.Next != nil {
left = mid
mid = mid.Next
}
fast = fast.Next.Next
}
left.Next = nil //断开
return merge12(sortInList(head), sortInList(mid)) //递归,merge12返回到上层是其中一个参数值
}
func merge12(p1,p2 *ListNode)*ListNode{
if p1==nil{
return p2
}
if p2==nil{
return p1
}
dummyList:=new(ListNode)
cur:=dummyList
for p1!=nil && p2!=nil{
if p1.Val< p2.Val{
cur.Next=p1
p1=p1.Next
}else{
cur.Next=p2
p2=p2.Next
}
cur=cur.Next
}
if p1==nil{
cur.Next=p2
}
if p2==nil{
cur.Next=p1
}
return dummyList.Next
}