86. Partition List(分隔鏈表)

題目

LeetCode中文站

解答

大致解析題目意思抵恋,就是把一個鏈表分成兩個部分,但是相對位置不變化嗤瞎,第一想法就是直接遍歷一次,分別使用兩個新鏈表存起來郑藏,最后拼接在一起衡查,就是需要的最后答案了。

  • 1.創(chuàng)建左鏈表和右鏈表必盖,并創(chuàng)建記錄當(dāng)前位置的節(jié)點(diǎn)拌牲。
  • 2.取出原鏈表中的節(jié)點(diǎn),被目標(biāo)參數(shù)比較歌粥,如果是小于目標(biāo)參數(shù)的塌忽,就放到左鏈表最后,并移動左鏈表當(dāng)前節(jié)點(diǎn)到下個節(jié)點(diǎn)失驶;如果是大于等于目標(biāo)參數(shù)的土居,就放到右鏈表最后,并移動右鏈表當(dāng)前節(jié)點(diǎn)到下個節(jié)點(diǎn)嬉探,最后移動原鏈表當(dāng)前節(jié)點(diǎn)到下個節(jié)點(diǎn)擦耀。
  • 3.重復(fù)步驟2拆挥,直到原鏈表所有的數(shù)據(jù)都被取完铭乾。
  • 4.最后拼接兩個鏈表,最后鏈表就是所需要的鏈表了
class Solution {
public:
    ListNode* partition(ListNode* head, int x) {
        // 左邊鏈表頭
        ListNode *leftHeadNode = new ListNode(0);
        // 右邊鏈表頭
        ListNode *rightHeadNode = new ListNode(0);
        // 左邊鏈表的當(dāng)前位置
        ListNode *leftCurrentNode = leftHeadNode;
        // 右邊鏈表的當(dāng)前位置
        ListNode *rightCurrentNode = rightHeadNode;
        while (head != NULL) {
            if (head->val < x) {
                // 把小于x的節(jié)點(diǎn)放到左鏈表最后 并移動當(dāng)前節(jié)點(diǎn)到下個節(jié)點(diǎn)
                leftCurrentNode->next = head;
                leftCurrentNode = leftCurrentNode->next;
            } else {
                // 把大于等于x的節(jié)點(diǎn)放到右鏈表最后 并移動當(dāng)前節(jié)點(diǎn)到下個節(jié)點(diǎn)
                rightCurrentNode->next = head;
                rightCurrentNode = rightCurrentNode->next;
            }
            head = head->next;
        }
        // 拼接兩個列表
        leftCurrentNode->next = rightHeadNode->next;
        rightCurrentNode->next = NULL;
        return leftHeadNode->next;
    }
};

以上代碼時間復(fù)雜度為O(n)想鹰,創(chuàng)建了兩個新的鏈表胎围,空間復(fù)雜度為O(n)吁系。

以上代碼時間復(fù)雜度已經(jīng)很低了德召,但是空間復(fù)雜度還有一定的優(yōu)化的空間,之前我們創(chuàng)建了兩個鏈表垮抗,現(xiàn)在考慮能不能就在原來的鏈表上操作氏捞,不創(chuàng)建新的鏈表呢?
這個我還沒想出來冒版,但是我們可以創(chuàng)建一個鏈表液茎,讓另外一部分在原來的鏈表上操作,最后拼接起來辞嗡。

  • 1.創(chuàng)建左鏈表和原鏈表的父節(jié)點(diǎn)捆等,并創(chuàng)建記錄當(dāng)前位置的節(jié)點(diǎn)。
  • 2.取出原鏈表中的節(jié)點(diǎn)续室,被目標(biāo)參數(shù)比較栋烤,如果是小于目標(biāo)參數(shù)的,就放到左鏈表最后挺狰,移動左鏈表當(dāng)前節(jié)點(diǎn)到下個節(jié)點(diǎn)明郭,并把當(dāng)前節(jié)點(diǎn)從原鏈表中刪除;如果是大于等于目標(biāo)參數(shù)的丰泊,直接移動原鏈表當(dāng)前節(jié)點(diǎn)到下個節(jié)點(diǎn)薯定。
  • 3.重復(fù)步驟2,直到原鏈表所有的數(shù)據(jù)都被取完瞳购。
  • 4.最后拼接兩個鏈表话侄,最后鏈表就是所需要的鏈表了
class Solution {
public:
    ListNode* partition(ListNode* head, int x) {
        // 左邊鏈表頭
        ListNode *leftHeadNode = new ListNode(0);
        // 原節(jié)點(diǎn)的父節(jié)點(diǎn)
        ListNode *fatherHeadNode = new ListNode(0);
        // 為了讓第一個節(jié)點(diǎn)擁有父節(jié)點(diǎn) 刪除節(jié)點(diǎn)的時候容易一點(diǎn) 所以為原鏈表設(shè)置一個父節(jié)點(diǎn)
        fatherHeadNode->next = head;
        // 左邊鏈表的當(dāng)前位置
        ListNode *leftCurrentNode = leftHeadNode;
        // 原鏈表的當(dāng)前位置
        ListNode *headCurrentNode = fatherHeadNode;
        while (headCurrentNode->next != NULL) {
            // 判斷當(dāng)前的值
            if (headCurrentNode->next->val < x) {
                // 把小于x的節(jié)點(diǎn)放到左鏈表最后 并移動當(dāng)前節(jié)點(diǎn)到下個節(jié)點(diǎn)
                leftCurrentNode->next = headCurrentNode->next;
                leftCurrentNode = leftCurrentNode->next;
                // 刪除當(dāng)前的節(jié)點(diǎn)
                headCurrentNode->next = headCurrentNode->next->next;
                leftCurrentNode->next = NULL;
            } else {
                // 當(dāng)前節(jié)點(diǎn)不變 移動當(dāng)前節(jié)點(diǎn)到下個節(jié)點(diǎn)
                headCurrentNode = headCurrentNode->next;
            }
        }
        // 拼接兩個列表
        leftCurrentNode->next = fatherHeadNode->next;
        return leftHeadNode->next;
    }
};

以上代碼時間復(fù)雜度為O(n),但是只創(chuàng)建了一個新的鏈表学赛,雖然空間復(fù)雜度還是為O(n)年堆,但是在使用的空間上比之前的算法減少了一點(diǎn)。

在朋友的提示下盏浇,終于想到了時間復(fù)雜度O(1)的解法变丧,說起來也簡單,之前怎么就沒有想到呢缠捌?

  • 原理就是通過和目標(biāo)參數(shù)的比較锄贷,把小于目標(biāo)參數(shù)的放在鏈表的前面,把大于等于目標(biāo)參數(shù)的放在鏈表的后面曼月,這樣相當(dāng)于鏈表就被分割成了兩部分谊却,最后把兩部分拼接起來就好了
class Solution {
public:
    ListNode* partition(ListNode* head, int x) {
        // 左邊鏈表頭
        ListNode *leftHeadNode = new ListNode(0);
        // 右邊鏈表頭
        ListNode *rightHeadNode = new ListNode(0);
        rightHeadNode->next = head;
        // 左邊鏈表的當(dāng)前位置
        ListNode *leftCurrentNode = leftHeadNode;
        // 右邊鏈表的當(dāng)前位置
        ListNode *rightCurrentNode = rightHeadNode;
        while (rightCurrentNode->next != NULL) {
            if (rightCurrentNode->next->val < x) {
                // 移除這個點(diǎn) 并重新拼接原來的節(jié)點(diǎn)
                leftCurrentNode->next = rightCurrentNode->next;
                leftCurrentNode = leftCurrentNode->next;
                rightCurrentNode->next = rightCurrentNode->next->next;
            } else {
                rightCurrentNode = rightCurrentNode->next;
            }
        }
        leftCurrentNode->next = rightHeadNode->next;
        return leftHeadNode->next;
    }
};

以上代碼時間復(fù)雜度為O(n),空間復(fù)雜度還是為O(1)哑芹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末炎辨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子聪姿,更是在濱河造成了極大的恐慌碴萧,老刑警劉巖乙嘀,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異破喻,居然都是意外死亡虎谢,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門曹质,熙熙樓的掌柜王于貴愁眉苦臉地迎上來婴噩,“玉大人,你說我怎么就攤上這事羽德〖该В” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵宅静,是天一觀的道長章蚣。 經(jīng)常有香客問我,道長姨夹,這世上最難降的妖魔是什么纤垂? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮磷账,結(jié)果婚禮上洒忧,老公的妹妹穿的比我還像新娘。我一直安慰自己够颠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布榄鉴。 她就那樣靜靜地躺著履磨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪庆尘。 梳的紋絲不亂的頭發(fā)上剃诅,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機(jī)與錄音驶忌,去河邊找鬼矛辕。 笑死,一個胖子當(dāng)著我的面吹牛付魔,可吹牛的內(nèi)容都是我干的聊品。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼几苍,長吁一口氣:“原來是場噩夢啊……” “哼翻屈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起妻坝,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤伸眶,失蹤者是張志新(化名)和其女友劉穎惊窖,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體厘贼,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡界酒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了嘴秸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毁欣。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖赁遗,靈堂內(nèi)的尸體忽然破棺而出署辉,到底是詐尸還是另有隱情,我是刑警寧澤岩四,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布哭尝,位于F島的核電站,受9級特大地震影響剖煌,放射性物質(zhì)發(fā)生泄漏材鹦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一耕姊、第九天 我趴在偏房一處隱蔽的房頂上張望桶唐。 院中可真熱鬧,春花似錦茉兰、人聲如沸尤泽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坯约。三九已至,卻和暖如春莫鸭,著一層夾襖步出監(jiān)牢的瞬間闹丐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工被因, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卿拴,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓梨与,卻偏偏與公主長得像堕花,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蛋欣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容