此题有点意思,先用快慢指针把链表从一半处断开,然后把后半段倒过来,然后再进行merge。注意断开时要把前面链表的最后置NULL,merge后要把最后节点next置NULL。
#include <string> #include <vector> #include <iostream> using namespace std; class Solution { public: ListNode * reverseList(ListNode *head) { if (head == NULL) return NULL; ListNode *dummy = new ListNode(0); dummy->next = head; ListNode *prev = dummy; ListNode *current = head; while (current != NULL) { ListNode *tmp = current->next; current->next = (prev == dummy ? NULL : prev); prev = current; current = tmp; } delete dummy; return prev; } void reorderList(ListNode *head) { if (head == NULL) return; ListNode *fast = head; ListNode *slow = head; do { if (fast == NULL || fast->next == NULL) break; fast = fast->next->next; slow = slow->next; } while (fast != slow); // disconnect the list from after slow ListNode *second = slow->next; slow->next = NULL; second = reverseList(second); ListNode *first = head; while (first != NULL && second != NULL) { ListNode *first_next = first->next; ListNode *second_next = second->next; first->next = second; second->next = first_next; first = first_next; second = second_next; } if (second != NULL) { second->next = NULL; } } };