题解 | #单链表的排序#

单链表的排序

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
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务