LeetCode 86. 分隔链表(c++)

56 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

前言

从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!

一、题目描述

86. 分隔链表

给你一个链表的头节点 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

二、思路分析

这是一道中等难度的题目,一开始我想要考虑在原链表中直接变换,首先找出比给定的数大且离给定的数最近的数,然后用一个指针q指向该数,将链表循环进行比较,但在编写程序时发现很难实现,因为链表中各个结点的位置都要进行变动。

然后想到了创建两个链表,分别存储比给定的数大的数和比给定的数小的数。最后将小的链表与大的链表相连接,返回头结点。

三、AC代码

class Solution {
public:
    ListNode* partition(ListNode* head, int x) {
        ListNode* s = new ListNode();
        ListNode* sHead = small;
        ListNode* l = new ListNode();
        ListNode* lHead = large;
        while (head != NULL) {
            if (head->val < x) {
                s->next = head;
                s = s->next;
            } else {
                l->next = head;
                l = l->next;
            }
            head = head->next;
        }
        l->next = NULL;
        s->next = lHead->next;
        return sHead->next;
    }
};

提交排名

image.png

四、总结

这个题目告诉我,当一条路走不通的时候,可以尝试去试试别的路。不要在一条路上白白的浪费宝贵的时间。