本文首發於公衆號「五分鐘學算法」,是圖解 LeetCode 系列文章之一。git
我的網站:www.cxyxiaowu.comgithub
題目來源於 LeetCode 上第 86 號問題:分割鏈表。題目難度爲 Easy,目前經過率爲 47.8% 。算法
給定一個鏈表和一個特定值 x,對鏈表進行分隔,使得全部小於 x 的節點都在大於或等於 x 的節點以前。bash
你應當保留兩個分區中每一個節點的初始相對位置。動畫
示例:網站
輸入: head = 1->4->3->2->5->2, x = 3
輸出: 1->2->2->4->3->5
複製代碼
這道題要求咱們劃分鏈表,把全部小於給定值的節點都移到前面,大於該值的節點順序不變,至關於一個局部排序的問題。ui
dummyHead1
用來保存小於於該值的鏈表,dummyHead2
來保存大於等於該值的鏈表dummyHead1
中,其他的放置在dummyHead2
中dummyHead2
插入到dummyHead1
後面class Solution {
public:
ListNode* partition(ListNode* head, int x) {
ListNode* dummyHead1 = new ListNode(-1);
ListNode* dummyHead2 = new ListNode(-1);
ListNode* prev1 = dummyHead1;
ListNode* prev2 = dummyHead2;
for(ListNode* cur = head ; cur != NULL ;){
if(cur->val < x){
prev1->next = cur;
cur = cur->next;
prev1 = prev1->next;
prev1->next = NULL;
}
else{
prev2->next = cur;
cur = cur->next;
prev2 = prev2->next;
prev2->next = NULL;
}
}
prev1->next = dummyHead2->next;
ListNode* ret = dummyHead1->next;
delete dummyHead1;
delete dummyHead2;
return ret;
}
};
複製代碼