2021-01-03 | 86. 分隔連結串列

CUG-GZ發表於2021-01-03

1. 題目描述

給你一個連結串列和一個特定值 x ,請你對連結串列進行分隔,使得所有小於 x 的節點都出現在大於或等於 x 的節點之前。

你應當保留兩個分割槽中每個節點的初始相對位置。

示例:

輸入:head = 1->4->3->2->5->2, x = 3
輸出:1->2->2->4->3->5

2. 解題思路

對於這道題目,一個很直接的思路就是初始化兩個連結串列,一個連結串列來儲存小於x的值,另一個連結串列來儲存大於x的值。

這裡還初始化了兩個連結串列:mallHead 和 largeHead。這兩個是連結串列的啞節點,即它們的 next 指標指向連結串列的頭節點,這樣做的目的是為了更方便地處理頭節點為空的邊界條件。

遍歷結束後,將 large 的 next 指標置空,這是因為當前節點複用的是原連結串列的節點,而其 next 指標可能指向一個小於 x 的節點,我們需要切斷這個引用。同時將 small 的 next 指標指向 largeHead 的 next 指標指向的節點,即真正意義上的 large 連結串列的頭節點。最後返回 smallHead 的 next 指標就是最後的答案。

複雜度分析:

  • 時間複雜度: O(n),其中 n 是原連結串列的長度,因為對該連結串列進行了一次遍歷。
  • 空間複雜度: O(1)。

3. 程式碼實現

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} x
 * @return {ListNode}
 */
var partition = function(head, x) {
    let small = new ListNode(0)
    const smallHead = small
    let large = new ListNode(0)
    const largeHead = large

    while(head){
        if(head.val < x){
            small.next = head
            small = small.next
        }else{
            large.next = head
            large = large.next
        }
        head = head.next
    }

    large.next = null
    small.next = largeHead.next
    return smallHead.next
};

4. 提交結果

在這裡插入圖片描述

相關文章