将len/2后的节点单独拿出来为l2链表,len/2前的链表为l1链表。然后合并两个链表即可。细节真多啊。。。
class Solution {
public:
void reorderList(ListNode* head) {
if (!head) return;
int len = 0;
ListNode* tmp_head = head;
ListNode* tail = nullptr;
ListNode* tmp = nullptr;
ListNode* l1 = nullptr, * l2 = nullptr;
while (head)
{
head = head->next;
len++;
}
if (len <= 2) return;
head = tmp_head;
int i = 1;
while (i < len / 2)
{
head = head->next;
i++;
}
if (len % 2 == 1)
{
head = head->next;
tail = head;
tmp = head->next;
head->next = nullptr;
}
else
{
tail = head;
tmp = head->next;
head->next = nullptr;
}
l2 = backList(tmp);
l1 = tmp_head;
i = 0;
while (i < len / 2)
{
auto l1_next = l1->next;
auto l2_next = l2->next;
l1->next = l2;
l2->next = l1_next;
l1 = l1_next;
l2 = l2_next;
i++;
}
l1 = tmp_head;
}
//链表反转
ListNode* backList(ListNode* head)
{
ListNode* new_head = nullptr;
ListNode* tmp = nullptr;
if (!head || !head->next) return head;
while (head)
{
tmp = head;
head = head->next;
tmp->next = new_head;
new_head = tmp;
}
return new_head;
}
};