重排链表

64 阅读1分钟

image.png

  1. 快慢指针找中值
  2. 从中值处分成两个链表
  3. 反转链表
  4. 合并链表

代码1:

代码 1 并不正确,原因在 mid 的确定,我们需要使反转的那个链表属于短的那一个,这样可以省去很多问题

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reorderList(head *ListNode) {
    if head.Next == nil || head.Next.Next == nil {
        return
    }
    a, b := head, head
    var c *ListNode
    for b != nil && b.Next != nil {
        b = b.Next.Next
        c = a
        a = a.Next
    }
    c.Next = nil
    a, b = head, rt(a)
    var t,h *ListNode
    for b != nil && a != nil {
        t = a.Next
        h = b.Next
        a.Next = b
        b.Next = t
        a = t 
        b = h
    }
    return
}
func rt(b *ListNode) *ListNode {
    var a, c *ListNode
    for b != nil {
        c = b.Next
        b.Next = a
        a = b
        b = c
    }
    return a
}

代码2:

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reorderList(head *ListNode) {
    if head.Next == nil || head.Next.Next == nil {
        return
    }
    a, b := head, head
    for b != nil && b.Next != nil {
        b = b.Next.Next
        a = a.Next
    }
    mid := a.Next
    a.Next = nil
    a, b = head, rt(mid)
    var t,h *ListNode
    for b != nil && a != nil {
        t = a.Next
        h = b.Next
        a.Next = b
        b.Next = t
        a = t 
        b = h
    }
    return
}
func rt(b *ListNode) *ListNode {
    var a, c *ListNode
    for b != nil {
        c = b.Next
        b.Next = a
        a = b
        b = c
    }
    return a
}