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;
心得
-
哑结点确实好用
-
有些空间是可以优化的, 不是必要的空间是优化的方向
-
如果想着在原链表上进行操作就会显得特别复杂