伍佰目录 短网址
  当前位置:海洋目录网 » 站长资讯 » 站长资讯 » 文章详细 订阅RssFeed

2021-03-13:手写代码:单链表快排。

来源:本站原创 浏览:100次 时间:2022-07-24

2021-03-13:手写代码:单链表快排。

福大大 答案2021-03-13:

根据链表的表头三分。比表头小的元素放左边,比表头大的元素放右边,等于表头的元素放中间。然后递归左边和递归右边。最后合并左、中、右。

代码用golang编写,代码如下:

package mainimport "fmt"func main() {    //head := &ListNode{Val: 4}    //head.Next = &ListNode{Val: 2}    //head.Next.Next = &ListNode{Val: 1}    //head.Next.Next.Next = &ListNode{Val: 3}    head := &ListNode{Val: -1}    head.Next = &ListNode{Val: 5}    head.Next.Next = &ListNode{Val: 3}    head.Next.Next.Next = &ListNode{Val: 4}    head.Next.Next.Next.Next = &ListNode{Val: 0}    cur := head    for cur != nil {        fmt.Print(cur.Val, "\t")        cur = cur.Next    }    fmt.Println()    head = sortList(head)    cur = head    for cur != nil {        fmt.Print(cur.Val, "\t")        cur = cur.Next    }    fmt.Println()}//Definition for singly-linked list.type ListNode struct {    Val  int    Next *ListNode}func sortList(head *ListNode) *ListNode {    ret, _ := process(head)    return ret}func process(head *ListNode) (*ListNode, *ListNode) {    left, leftend, mid, midend, right, rightend := partition(head)    if left != nil {        left, leftend = process(left)    }    if right != nil {        right, rightend = process(right)    }    return merge(left, leftend, mid, midend, right, rightend)}func partition(head *ListNode) (*ListNode, *ListNode, *ListNode, *ListNode, *ListNode, *ListNode) {    left := &ListNode{} //虚拟节点    leftend := left    mid := head    midend := mid    right := &ListNode{} //虚拟节点    rightend := right    cur := head.Next    for cur != nil {        if cur.Val < mid.Val {            leftend.Next = cur            leftend = leftend.Next        } else if cur.Val == mid.Val {            midend.Next = cur            midend = midend.Next        } else {            rightend.Next = cur            rightend = rightend.Next        }        cur = cur.Next    }    leftend.Next = nil    midend.Next = nil    rightend.Next = nil    left = left.Next    if left == nil {        leftend = nil    }    right = right.Next    if right == nil {        rightend = nil    }    return left, leftend, mid, midend, right, rightend}func merge(left, leftend, mid, midend, right, rightend *ListNode) (*ListNode, *ListNode) {    head := &ListNode{}    headend := head    if left != nil {        headend.Next = left        headend = leftend    }    headend.Next = mid    headend = midend    if right != nil {        headend.Next = right        headend = rightend    }    head = head.Next    if head == nil {        headend = nil    }    return head, headend}

执行结果如下:


力扣148. 排序链表
评论

  推荐站点

  • At-lib分类目录At-lib分类目录

    At-lib网站分类目录汇集全国所有高质量网站,是中国权威的中文网站分类目录,给站长提供免费网址目录提交收录和推荐最新最全的优秀网站大全是名站导航之家

    www.at-lib.cn
  • 中国链接目录中国链接目录

    中国链接目录简称链接目录,是收录优秀网站和淘宝网店的网站分类目录,为您提供优质的网址导航服务,也是网店进行收录推广,站长免费推广网站、加快百度收录、增加友情链接和网站外链的平台。

    www.cnlink.org
  • 35目录网35目录网

    35目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向35目录推荐、提交优秀网站。

    www.35mulu.com
  • 就要爱网站目录就要爱网站目录

    就要爱网站目录,按主题和类别列出网站。所有提交的网站都经过人工审查,确保质量和无垃圾邮件的结果。

    www.912219.com
  • 伍佰目录伍佰目录

    伍佰网站目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向伍佰目录推荐、提交优秀网站。

    www.wbwb.net