EX:
head = 1->4->3->2->5->2, x = 3
Ans: 1->2->2->4->3->5
想法:
這題基本上沒啥特別的技巧,就是實作題,首先先traverse 整個 list ,找到第一個
大於等於 x 的 node 當 pivot,之後只要遇到小於 x 的 node 就把它丟到 pivot 前,比較
需要注意的是 list 類的題目都要小心 head 的情況,因此簡單的實作方式是多新增一個
dummy node 來放在 head 之前,就可以很簡單的考慮 head 的情況拉。
Time Complexity: O(n) time
完整程式碼:
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
ListNode dummy(0);
dummy.next = head;
ListNode* cur = head;
ListNode* pre = &dummy;
ListNode* less = &dummy;
ListNode* pivot = nullptr;
while (cur != nullptr) {
if (cur->val >= x) {
if (pivot == nullptr) {
pivot = cur;
less = pre;
}
pre = cur;
cur = cur->next;
}
else if (cur->val < x) {
if (pivot != nullptr) {
auto tmp = less->next;
pre->next = cur->next;
less->next = cur;
less = less->next;
less->next = tmp;
cur = pre->next;
}
else {
pre = cur;
cur = cur->next;
}
}
else {
pre = cur;
cur = cur->next;
}
}
return dummy.next;
}
};
沒有留言:
張貼留言