ListNode *merge(ListNode *odd, ListNode *even){
ListNode dummy, *tail = &dummy;
bool isEven = true;
while (odd || even) {
//奇数链表为空 或者 偶数标记 偶数链表不为空 那就在尾部添加偶数结点
if (!odd || isEven && even) {
tail->next = even;
even = even->next;
}else{
tail->next = odd;
odd = odd->next;
}
//尾部指针更新
tail = tail->next;
//奇偶变化
isEven = !isEven;
}
// 注意:这里一定要记得把tail.next设置为空。
// 虽然这个题可能并不需要,但是应该养成收尾的好习惯
tail->next = nullptr;
return dummy.next;
}
ListNode* swapPairs(ListNode* head) {
ListNode odd, *odd_tail = &odd;
ListNode even, *even_tail = &even;
auto p = head;
int idx = 1;
while (p) {
auto back = p->next;
//利用位运算提高效率 分别生成奇偶两个列表
if (idx & 0x01) {
odd_tail->next = p;
odd_tail = p;
}else{
even_tail->next = p;
even_tail = p;
}
p = back;
idx ++;
}
// 注意:这里一定要记得把tail.next设置为空。
// 虽然这个题可能并不需要,但是应该养成收尾的好习惯
odd_tail->next = nullptr;
even_tail->next = nullptr;
return merge(odd.next, even.next);
}
题目