查阅更多的题解,请点击
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:
- 原链表为空
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;
}
};