leetcode 重排連結串列 中等
阿新 • • 發佈:2021-09-17
①:用 vector 存下整個連結串列,然後按題目要求鏈起來即可。時間空間 O(n)
②:將連結串列從中間位置分割為兩個連結串列,並將後半部分連結串列進行反轉,然後再鏈起來即可。時間 O(n),空間 O(1)
class Solution { public: void reorderList(ListNode* head) { ListNode *tail = reverseHalfList(head); ListNode *ptr = head; while(tail) { // tail 為 nullptr, 整個連結就完成了.ListNode *ptrNext = ptr -> next; ListNode *tailLast = tail -> next; ptr -> next = tail; tail -> next = ptrNext; ptr = ptrNext; tail = tailLast; } } private: ListNode* reverseHalfList(ListNode *head) { ListNode*slow = head, *quick = head; // 尋找連結串列中間節點 // 連結串列結點為單數, slow 停止中間節點. 為偶數 slow 停止在中間第一個結點 while(quick && quick -> next && quick -> next -> next) { slow = slow -> next; quick = quick -> next -> next; } ListNode*slowNext = slow -> next; slow -> next = nullptr; return reverseList(slowNext); } ListNode* reverseList(ListNode *head) { ListNode *pre = nullptr; while(head) { ListNode *nxt = head -> next; head -> next = pre; pre = head; head = nxt; } return pre; } };