思路1:
1.链表拆分&合并
2.每次同时处理奇偶节点,需要判断边界问题,比较复杂
3.末尾处要设置成指向空
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* oddEvenList(ListNode* head) {
if(!head || !head->next) return head;
auto odd = head->next;
auto l2 = odd;
auto l1 = head;
auto res = head;
head->next = odd->next;
head = head->next;
odd->next = NULL;
while(head && head->next)//条件比较复杂
{
odd->next = head->next;
odd = odd->next;
head->next = head->next->next;
l1 = head;
head = head->next;
}
if(!head) l1->next = l2;
else head->next = l2;
odd->next = NULL;
return res;
}
};
思路2:
1.遍历一遍链表,每次只处理一个节点,判定奇偶
2.构造两个虚拟头节点,依次往后遍历
3.更清晰
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* oddEvenList(ListNode* head) {
if(!head || !head->next) return head;
auto odd_dummy = new ListNode(-1);
auto even_dummy = new ListNode(-1);
auto odd = odd_dummy;
auto even = even_dummy;
auto temp = head;
int cnt = 0;
while(head)
{
if(cnt % 2 == 0)
{
odd->next = head;
odd = odd->next;
}
else
{
even->next = head;
even = even->next;
}
cnt ++;
head = head->next;
}
odd->next = even_dummy->next;
even->next = NULL;
return odd_dummy->next;
}
};