Problem
题目大意:给你一个链表,把所有奇数位置的节点串在一起,后面跟着所有串在一起的偶数位置的节点。
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:
Given 1->2->3->4->5->NULL
,
return 1->3->5->2->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 …
Credits:
Special thanks to @DjangoUnchained for adding this problem and creating all test cases.
Solution
Time complexity: O(n)
Space complexity: O(1)
C++
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 |
// Author: Huahua // Running time: 21 ms class Solution { public: ListNode* oddEvenList(ListNode* head) { if (head == nullptr) return head; ListNode dummy_odd(0); ListNode dummy_even(0); ListNode* prev_odd = &dummy_odd; ListNode* prev_even = &dummy_even; int index = 0; while (head) { auto next = head->next; head->next = nullptr; // important if (index++ & 1) { prev_even->next = head; prev_even = head; } else { prev_odd->next = head; prev_odd = head; } head = next; } prev_odd->next = dummy_even.next; return dummy_odd.next; } }; |
V2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// Author: Huahua // Running time: 18 ms class Solution { public: ListNode* oddEvenList(ListNode* head) { if (head == nullptr) return head; vector<ListNode> heads(2, ListNode(0)); vector<ListNode*> prevs{&heads[0], &heads[1]}; int index = 0; while (head) { auto next = head->next; head->next = nullptr; // important prevs[index]->next = head; prevs[index] = head; head = next; index ^= 1; } prevs[0]->next = heads[1].next; return heads[0].next; } }; |
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// Author: Huahua // Running time: 1 ms class Solution { public ListNode oddEvenList(ListNode head) { ListNode[] heads = new ListNode[]{new ListNode(0), new ListNode(0)}; ListNode[] prevs = new ListNode[]{heads[0], heads[1]}; int index = 0; while (head != null) { ListNode next = head.next; head.next = null; prevs[index].next = head; prevs[index] = prevs[index].next; head = next; index ^= 1; } prevs[0].next = heads[1].next; return heads[0].next; } } |
Python3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
""" Author: Huahua Running time: 56 ms """ class Solution: def oddEvenList(self, head): heads = [ListNode(0), ListNode(0)] prevs = [heads[0], heads[1]] index = 0 while head: nxt = head.next head.next = None prevs[index].next = head prevs[index] = prevs[index].next head = nxt index ^= 1 prevs[0].next = heads[1].next return heads[0].next |
请尊重作者的劳动成果,转载请注明出处!花花保留对文章/视频的所有权利。
如果您喜欢这篇文章/视频,欢迎您捐赠花花。
If you like my articles / videos, donations are welcome.
Be First to Comment