No.328_奇偶链表

328 奇偶链表-中等

题目:

给定单链表的头节点 head,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排列的链表。

第一个节点的索引被认为是奇数,第二个节点的索引被认为是偶数。

请注意,偶数组和奇数组内部的相对位置应该与输入时保持一致。

你必须在 O(1) 的额外空间复杂度和 O(N) 的时间复杂度下解决这个问题。

分析:

这个问题过于简单了,就是按索引重新分组。

利用两个【哑结点】,分别保存索引为奇数和偶数的节点,然后重新拼接。

// date 2023/10/12
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func oddEvenList(head *ListNode) *ListNode {
    if head == nil || head.Next == nil || head.Next.Next == nil {
        return head
    }
    d1, d2 := &ListNode{}, &ListNode{}
    p1, p2 := d1, d2
    idx := 0
    for head != nil {
        if idx % 2 == 0 {
            p1.Next = head
            p1 = p1.Next
        } else {
            p2.Next = head
            p2 = p2.Next
        }
        idx++
        head = head.Next
    }
    p2.Next = nil
    p1.Next = d2.Next
    return d1.Next
}

延展一下

不以索引的奇偶作为分组标准,而是以链表中结点值的奇偶性作为分组的标准。

请注意,以第一个节点值的奇偶性作为起始。即如果第一个节点值为奇数,那么所有的奇数在前。

最后更新于