刷题-力扣-面试题 02.04. 分割链表

题目链接

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/partition-list-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目描述

给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。

你不需要 保留 每个分区中各节点的初始相对位置。

示例 1:

输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]

示例 2:

输入:head = [2,1], x = 2
输出:[1,2]

提示:

  • 链表中节点的数目在范围 [0, 200] 内
  • -100 <= Node.val <= 100
  • -200 <= x <= 200

题目分析

  1. 根据题目描述,将小于x的节点放置于左侧,大于等x的节点放置于右侧,节点顺序无要求
  2. 设置两个头节点,分别接收小于x的节点,和大于等于x的节点,最后将两个链表连接起来

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* partition(ListNode* head, int x) {
        if (!head || !head->next) {
            return head;
        }
        ListNode* maxNode = new ListNode();
        ListNode* minNode = new ListNode();
        ListNode* pMax = maxNode;
        ListNode* pMin = minNode;
        while (head) {
            if (head->val < x) {
                pMin->next = head;
                pMin = pMin->next;
            } else {
                pMax->next = head;
                pMax = pMax->next;
            }
            head = head->next;
        }
        pMax->next = nullptr;
        pMin->next = maxNode->next;
        head = minNode->next;
        delete maxNode;
        delete minNode;
        return head;
    }
};
posted @ 2022-01-17 13:55  韩亚光  阅读(28)  评论(0编辑  收藏  举报