本文首發於公眾號「五分鐘學演算法」,是圖解 LeetCode 系列文章之一。
個人網站:www.cxyxiaowu.com
題目來源於 LeetCode 上第 86 號問題:分割連結串列。題目難度為 Easy,目前通過率為 47.8% 。
題目描述
給定一個連結串列和一個特定值 x,對連結串列進行分隔,使得所有小於 x 的節點都在大於或等於 x 的節點之前。
你應當保留兩個分割槽中每個節點的初始相對位置。
示例:
輸入: head = 1->4->3->2->5->2, x = 3
輸出: 1->2->2->4->3->5
複製程式碼
題目解析
這道題要求我們劃分連結串列,把所有小於給定值的節點都移到前面,大於該值的節點順序不變,相當於一個區域性排序的問題。
- 設定兩個虛擬節點,
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;
}
};
複製程式碼