-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.cpp
More file actions
74 lines (68 loc) · 2.13 KB
/
main.cpp
File metadata and controls
74 lines (68 loc) · 2.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
// Source: https://leetcode.com/problems/odd-even-linked-list
// Title: Odd Even Linked List
// Difficulty: Medium
// Author: Mu Yang <http://muyang.pro>
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Given the `head` of a singly linked list, group all the nodes with odd indices together followed by the nodes with even indices, and return the reordered list.
//
// The **first** node is considered **odd**, and the **second** node is **even**, and so on.
//
// Note that the relative order inside both the even and odd groups should remain as it was in the input.
//
// You must solve the problemin `O(1)`extra space complexity and `O(n)` time complexity.
//
// **Example 1:**
// https://assets.leetcode.com/uploads/2021/03/10/oddeven-linked-list.jpg
//
// ```
// Input: head = [1,2,3,4,5]
// Output: [1,3,5,2,4]
// ```
//
// **Example 2:**
// https://assets.leetcode.com/uploads/2021/03/10/oddeven2-linked-list.jpg
//
// ```
// Input: head = [2,1,3,5,6,4,7]
// Output: [2,3,6,7,1,5,4]
// ```
//
// **Constraints:**
//
// - The number of nodes in the linked list is in the range `[0, 10^4]`.
// - `-10^6 <= Node.val <= 10^6`
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
using namespace std;
struct ListNode {
int val;
ListNode* next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode* next) : val(x), next(next) {}
};
class Solution {
public:
ListNode* oddEvenList(ListNode* head) {
// Edge cases
if (head == nullptr || head->next == nullptr) return head;
auto oddHead = head, oddTail = head;
auto evenHead = head->next, evenTail = head->next;
auto node = head->next->next;
auto isOdd = true;
while (node) {
if (isOdd) {
oddTail->next = node;
oddTail = node;
} else {
evenTail->next = node;
evenTail = node;
}
node = node->next;
isOdd = !isOdd;
}
oddTail->next = evenHead;
evenTail->next = nullptr;
return oddHead;
}
};