LeetCode 328. Odd Even Linked List(Medium)

查阅更多的题解,请点击

Problem

328. Odd Even Linked List(Medium)

Given a singly linked list, group all odd nodes together followed by the even nodes. Please note here we are talking about the node number and not the value in the nodes.

You should try to do it in place. The program should run in O(1) space complexity and O(nodes) time complexity.

Example 1:

Input: 1->2->3->4->5->NULL
Output: 1->3->5->2->4->NULL

Example 2:

Input: 2->1->3->5->6->4->7->NULL
Output: 2->3->6->7->1->5->4->NULL

Note:

  • The relative order inside both the even and odd groups should remain as it was in the input.
  • The first node is considered odd, the second node even and so on …

Solution

设链表结点数为n

O(n) time, O(1) space

题目要求将原始的链表结点重新组合,从1到n编号,在新链表中:

  • 编号为奇数的统一放在新链表的前面,编号为偶数的统一放在新链表的后面
  • 同一个group(即在原链表中,编号奇偶性相同的结点)的结点相对位置不变

考虑链表奇偶相间,则整个求解过程相当于对原链表遍历,在遍历过程中有两个中间结果:奇数group和偶数group,则需要odd和even指针指向当前遍历到的奇偶结点

由于遍历结束需要merge两个链表并返回新链表的头结点,则需要firstOdd和FirstEven指针指向两个group的首部。由此需要4个指针完成整个过程,遍历更新过程如下

odd->next = even->next;
odd = odd->next;

even->next = odd->next;
even = even->next;

结束条件

  • 当前的odd为空或even为空

Corner case

  • 原链表为空

GitHub传送门

class Solution
{
  public:
    ListNode *oddEvenList(ListNode *head)
    {
        if (head == nullptr)
            return nullptr;
        ListNode *firstOdd = head;
        ListNode *firstEven = firstOdd->next;
        ListNode *even = firstEven;
        ListNode *odd = firstOdd;
        while (even != nullptr)
        {
            if (even->next == nullptr)
                break;
            odd->next = even->next;
            odd = odd->next;

            even->next = odd->next;
            even = even->next;
        }
        if (even != nullptr)
            node->next = nullptr;
        odd->next = even;
        return head;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值