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;
心得
-
啞結點確實好用
-
有些空間是可以優化的, 不是必要的空間是優化的方向
-
如果想着在原鏈表上進行操作就會顯得特別複雜