【LeetCode-链表】分隔链表

题目描述

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

你应当保留两个分区中每个节点的初始相对位置。

示例:

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

题目链接: https://leetcode-cn.com/problems/partition-list/

思路

x会将链表分割成两部分,左链表中的节点值全都小于x,右链表中的节点值全都大于等于x,则我们可以创建两个链表smallList和bigList,smallList存储左链表,bigList存储右链表。从头开始遍历原链表,当当前节点值小于x时,将当前结点加入smallList;否则加入到bigList。代码如下:

/**
 * 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==nullptr){
            return nullptr;
        }

        ListNode* smallList = new ListNode(0);  // 数值<x的链表头
        ListNode* bigList = new ListNode(0);    // 数值>=x的链表头
        ListNode* curSmall = smallList;
        ListNode* curBig = bigList;
        ListNode* curNode = head;
        while(curNode!=nullptr){
            if(curNode->val<x){
                curSmall->next = curNode;
                curSmall = curNode;
                curNode = curNode->next;
            }else{
                curBig->next = curNode;
                curBig = curNode;
                curNode = curNode->next;
            }
        }
        curSmall->next = bigList->next;
        curBig->next = nullptr; //  这句别忘了
        return smallList->next;
    }
};
  • 时间复杂度:O(n)

    遍历了链表一遍。

  • 空间复杂度:O(1)

    申请的额外内存不随输入规模的增大而增大。

原文地址:https://www.cnblogs.com/flix/p/12676093.html

时间: 2024-10-09 00:58:17

【LeetCode-链表】分隔链表的相关文章

[LeetCode] 86. 分隔链表

题目链接 : https://leetcode-cn.com/problems/partition-list/ 题目描述: 给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前. 你应当保留两个分区中每个节点的初始相对位置. 示例: 输入: head = 1->4->3->2->5->2, x = 3 输出: 1->2->2->4->3->5 思路: 用两个链表,一个链表放小于x的节点,一个链表放大

【Leetcode】分隔链表

题目链接:分隔链表 题意:给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前. 你应当保留两个分区中每个节点的初始相对位置. 题解:QAQ刚开始看题目看错了.以为是那种排序.要按大小的.写了一堆错的.然后重新看题,发现简单了不少啊. 用两个链表分别放比x小的和比x大的,最后组合在一起就行了..只要求保留相对位置 代码: 1 /** 2 * Definition for singly-linked list. 3 * struct ListNode

leetcode 86. 分隔链表(Partition List)

目录 题目描述: 示例: 解法: 题目描述: 给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前. 你应当保留两个分区中每个节点的初始相对位置. 示例: 输入: head = 1->4->3->2->5->2, x = 3 输出: 1->2->2->4->3->5 解法: /** * Definition for singly-linked list. * struct ListNode { *

Leetcode:Partition List 链表快速排序划分

Partition List Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x. You should preserve the original relative order of the nodes in each of the two partitions. For example,Given

Leetcode:Rotate List 链表旋转

Rotate List Given a list, rotate the list to the right by k places, where k is non-negative. For example:Given 1->2->3->4->5->NULL and k = 2,return 4->5->1->2->3->NULL. 解题分析: 不同于数组旋转,数组可以随机存取,数组的旋转可以巧妙的 分成两两部分递归旋转 对于链表的旋转,实际上

Linked List Cycle leetcode java (链表检测环)

题目: Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using extra space? 题解: 这道题连带着II是很经典的,在看CC150时候,纠结这个问题纠结了很久.在读了很多网上资料还有书的讲解以及和别人讨论之后,对这个专题终于明白了. 这一问只需要判断链表是否有环. 当链表没有环时是很好判断的,让一个指针一直往后走,遇见null了自然就没有环. 而如

[Swift]LeetCode725. 分隔链表 | Split Linked List in Parts

Given a (singly) linked list with head node root, write a function to split the linked list into k consecutive linked list "parts". The length of each part should be as equal as possible: no two parts should have a size differing by more than 1.

图解精选 TOP 面试题 001 | LeetCode 237. 删除链表中的节点

题目描述 原题链接 LeetCode 237. 删除链表中的节点:https://leetcode-cn.com/problems/delete-node-in-a-linked-list 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 head =?[4,5,1,9],它可以表示为: 示例 1: 输入: head = [4,5,1,9], node = 5 输出: [4,1,9] 解释: 给定你链表中值为 ?5? 的第二个节点,那么在调

链表算法-链表前面插入节点

链表算法-链表前面插入节点

【编程题目】从尾到头输出链表(链表)☆

58.从尾到头输出链表(链表).题目:输入一个链表的头结点,从尾到头反过来输出每个结点的值.链表结点定义如下:struct ListNode{int m_nKey;ListNode* m_pNext;}; 我的思路:用一个数组存起来已有的数字,再反过来输出.缺点是数组大小是确定的 链表长度不能超过数组的大小 /* 58.从尾到头输出链表(链表). 题目:输入一个链表的头结点,从尾到头反过来输出每个结点的值.链表结点定义如下: struct ListNode { int m_nKey; ListN