【leetcode】86. 分隔链表 详解

86. 分隔链表

解题思路

暴力解法

  • 扫描链表 把小于x的队列依次加入到 arr1 ,大于等于的 加入到 arr2

  • 然后 在dummy 结点 依次加入arr1 arr2

复杂度分析

时间复杂度 O(N)

空间复杂度O(N)

代码

vector  arr1, arr2;
ListNode * dummy = new ListNode(-1) ;
ListNode *end = dummy;

while (head != nullptr) {
    if (head->val < x) {
        arr1.push_back(head->val );
    } else {
        arr2.push_back(head->val );
    }
    head = head->next;
}

for (auto item : arr1) {
    end->next = new ListNode(item);
    end = end->next;
}
for (auto item : arr2) {
    end->next = new ListNode(item);
    end = end->next;
}

return dummy->next;

优化

空间复杂度太高, 进行优化

用哑结点1, 哑结点2 分别当做 上面的arr1 和 arr2

小于x 的 连接到 哑结点1尾部

大于等于x 的 连接到 哑结点2尾部

然后把 哑结点1的尾 和 哑结点2的头 连接

 		ListNode * dummy1 = new ListNode(-1);
        ListNode * dummy2 = new ListNode(-1);
        ListNode *end1 = dummy1;
        ListNode *end2 = dummy2;

        while (head != nullptr) {
            if (head->val < x) {
                end1->next = head;
                end1 = end1->next;
            } else {
                end2->next = head;
                end2 = end2->next;
            }
            head = head->next;
        }
        // connect together
        end1->next = dummy2->next;
        end2->next = nullptr;

        return dummy1->next;

心得

  • 哑结点确实好用

  • 有些空间是可以优化的, 不是必要的空间是优化的方向

  • 如果想着在原链表上进行操作就会显得特别复杂

你可能感兴趣的:(LeetCode笔记)