【leetcode】86. 分隔鏈表 詳解

86. 分隔鏈表

解題思路

暴力解法

  • 掃描鏈表 把小於x的隊列依次加入到 arr1 ,大於等於的 加入到 arr2

  • 然後 在dummy 結點 依次加入arr1 arr2

複雜度分析

時間複雜度 O(N)

空間複雜度O(N)

代碼

vector <int> arr1, arr2;
ListNode * dummy = new ListNode(-1) ;
ListNode *end = dummy;

while (head != nullptr) {
    if (head->val < x) {
        arr1.push_back(head->val );
    } else {
        arr2.push_back(head->val );
    }
    head = head->next;
}

for (auto item : arr1) {
    end->next = new ListNode(item);
    end = end->next;
}
for (auto item : arr2) {
    end->next = new ListNode(item);
    end = end->next;
}

return dummy->next;

優化

空間複雜度太高, 進行優化

用啞結點1, 啞結點2 分別當做 上面的arr1 和 arr2

小於x 的 連接到 啞結點1尾部

大於等於x 的 連接到 啞結點2尾部

然後把 啞結點1的尾 和 啞結點2的頭 連接

 		ListNode * dummy1 = new ListNode(-1);
        ListNode * dummy2 = new ListNode(-1);
        ListNode *end1 = dummy1;
        ListNode *end2 = dummy2;

        while (head != nullptr) {
            if (head->val < x) {
                end1->next = head;
                end1 = end1->next;
            } else {
                end2->next = head;
                end2 = end2->next;
            }
            head = head->next;
        }
        // connect together
        end1->next = dummy2->next;
        end2->next = nullptr;

        return dummy1->next;

心得

  • 啞結點確實好用

  • 有些空間是可以優化的, 不是必要的空間是優化的方向

  • 如果想着在原鏈表上進行操作就會顯得特別複雜

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章