143 重排链表-中等

题目:

给定一个单链表 L 的头节点 head ,单链表 L 表示为:

L0 → L1 → … → Ln - 1 → Ln 请将其重新排列后变为:

L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

分析:

快慢指针,找出链表的中间节点;slow 指针继续走,同时反转后半段链表。

然后将前半段和后半段链表合并。

要对每一段代码很熟悉,要精确的知道每段代码的结果是什么样子;然后大问题拆成小问题去解决。

// date 2023/10/17
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reorderList(head *ListNode)  {
    var tail *ListNode
    slow, fast := head, head
    spre := head
    for fast != nil && fast.Next != nil {
        spre = slow
        slow = slow.Next
        fast = fast.Next.Next
    }
    if fast != nil {
        spre = slow
        slow = slow.Next
    }
    // make part one, [head, spre]
    spre.Next = nil
    part1 := head

    for slow != nil {
        sn := slow.Next
        slow.Next = tail
        tail = slow
        slow = sn
    }

    head = merge(part1, tail)
}

func merge(l1, l2 *ListNode) *ListNode{
    dumy := &ListNode{}
    pre := dumy
    for l1 != nil && l2 != nil {
        l1f := l1.Next
        l2f := l2.Next

        l1.Next = l2
        pre.Next = l1
        pre = l2

        l1 = l1f
        l2 = l2f
    }
    if l1 != nil {
        pre.Next = l1
    }
    return dumy.Next
}

最后更新于