方法一:双指针
1、设置两个指针,奇数指针和偶数指针;
2、将奇数指针的下一结点为偶数指针的下一个结点;奇数指针移动到下一个结点后,此时将偶数指针的下一个结点设置为奇数指针的下一个结点,移动偶数指针。
时间复杂度:o(n)
空间复杂度:o(1),不需要辅助空间
class Solution {
public:
ListNode* oddEvenList(ListNode* head) {
//特殊情况处理
if (head == nullptr || head->next == nullptr)
return head;
ListNode* odd = head;
ListNode* even = head->next;
ListNode* temp = even;
while (even != nullptr && even->next != nullptr) {
odd->next = even->next;
odd = odd->next;
even->next = odd->next;
even = even->next;
}
odd->next = temp;
return head;
}
};
odd->next = temp不可写为odd->next = head->next,因为到这一步head->next已经不再是初始链表的结点了。
方法二:利用辅助空间
生成两个链表,一个保存奇数结点,另一个保存偶数结点,遍历完初始链表后,将奇数链表末尾连接至偶数链表头结点即可、
时间复杂度:o(n)
空间复杂度:o(n)
class Solution {
public:
ListNode* oddEvenList(ListNode* head) {
if (head == nullptr || head->next == nullptr)
return head;
//生成两个链表,分别保存奇数结点和偶数结点
ListNode* phead1 = new ListNode(0);
ListNode* head1 = phead1;
ListNode* phead2 = new ListNode(0);
ListNode* head2 = phead2;
while (head) {
head1->next = new ListNode(head->val);
head1 = head1->next;
head = head->next;
if (head) {
head2->next = new ListNode(head->val);
head2 = head2->next;
head = head->next;
}
}
//偶数链表末尾指向nullptr
head2->next = nullptr;
//奇数链表末尾指向偶数链表头结点
head1->next = phead2->next;
return phead1->next;
}
};

京公网安备 11010502036488号