LeetCode 第 86 號問題:分割鏈表

本文首發於公衆號「五分鐘學算法」,是圖解 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;
    }
};
複製代碼

相關文章
相關標籤/搜索