数据结构:
type ListNode struct {
Val int
Next *ListNode
}
代码皆经过测试:
/**
排序链表
*/
func SortListNode(head *Model.ListNode) *Model.ListNode {
if head == nil {
return nil
}
return mergeSort(head)
}
func mergeSort(head *Model.ListNode) *Model.ListNode {
if head.Next == nil {
return head
}
p := head
q := head
var per *Model.ListNode
for ; q != nil && q.Next != nil; {
per, p, q = p, p.Next, q.Next.Next
}
per.Next = nil
l := mergeSort(head)
r := mergeSort(p)
return merge(l, r)
}
func merge(l *Model.ListNode, r *Model.ListNode) *Model.ListNode {
dummyHead := &Model.ListNode{}
cur := dummyHead
for ; l != nil && r != nil; {
if l.Val <= r.Val {
cur.Next = l
cur = cur.Next
l = l.Next
} else {
cur.Next = r
cur = cur.Next
r = r.Next
}
}
if l != nil {
cur.Next = l
}
if r != nil {
cur.Next = r
}
return dummyHead.Next
}
/**
回文链表
*/
func isPalindrome(head *Model.ListNode) bool {
if head == nil || head.Next == nil {
return true
}
fast := head //快指针
slow := head //慢指针
for ; fast.Next != nil && fast.Next.Next != nil; {
fast = fast.Next.Next
slow = slow.Next
}
slow = reverse(slow.Next)
for ; slow != nil; {
if head.Val != slow.Val {
return false
}
head = head.Next
slow = slow.Next
}
return true
}
/**
反转链表
*/
func reverse(node *Model.ListNode) *Model.ListNode {
if node.Next == nil {
return node
}
newHead := reverse(node.Next)
node.Next.Next = node
node.Next = nil
return newHead
}
/**
环型链表
*/
func detectCycle(head *Model.ListNode) *Model.ListNode {
slow := head
fast := head
isCycle := false
//先用快慢指针判断是否是环形
for ; fast != nil && fast.Next != nil; {
slow = slow.Next
fast = fast.Next.Next
if slow == fast {
isCycle = true
break
}
}
if isCycle {
//慢指针不动,利用快指针找出环的大小
cycleSize := 1
fast = fast.Next
for ; slow != fast; {
fast = fast.Next
cycleSize++
}
//根据环的大小,利用双指针找出环形入口,前后指针间隔为环的大小
slow1 := head
fast1 := head
for ; cycleSize-1 > 0; {
fast1 = fast1.Next
cycleSize--
}
//找入口的关键判断条件
for ; fast1.Next != slow1; {
slow1 = slow1.Next
fast1 = fast1.Next
}
return slow1
}
return nil
}
/**
合并K个链表
*/
func mergeKLists(lists []*Model.ListNode) *Model.ListNode {
if lists == nil {
return nil
}
var mergeListNode *Model.ListNode
for i := 0; i < len(lists); i++ {
mergeListNode = merge(mergeListNode, lists[i])
}
return mergeListNode
}