1. 程式人生 > 其它 >leetcode 重排連結串列 中等

leetcode 重排連結串列 中等

①:用 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; } };