2021-03-13:手寫代碼:單鏈錶快排。golang
福大大 答案2021-03-13:ide
根據鏈表的表頭三分。比表頭小的元素放左邊,比表頭大的元素放右邊,等於表頭的元素放中間。而後遞歸左邊和遞歸右邊。最後合併左、中、右。code
代碼用golang編寫,代碼以下:blog
package main import "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 }
執行結果以下:排序