zoukankan      html  css  js  c++  java
  • leetcode

    题目: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 1->4->3->2->5->2 and x = 3,
    return 1->2->2->4->3->5.

    题目的意思是,在不改变原来序列的相对位置的条件下,把比x小的放在前面,其余的放在后面

    个人思路:

    1、根据序列的第一个结点是否小于x分成两种情况,若小于x,则将整个序列看成两部分,第一部分是小于x的序列,第二部分是还未遍历过的,当我们去遍历第二部分时,将第二部分的小于x的结点放到第一部分的尾部,直到第二部分遍历完成即可,这时的第二部分就是大等于x的序列,若大等于x,则第一部分是大等于x的序列,遍历第二部分时将大等于x的结点放到第一部分尾部,遍历结束时再将这两部分颠倒一下即可

    2、注意一下边界情况即可

    代码:

      1 /*
      2 #include <stddef.h>
      3 
      4 struct ListNode
      5 {
      6     int val;
      7     ListNode *next;
      8     ListNode(int x) : val(x), next(NULL) {};
      9 };
     10 */
     11 class Solution
     12 {
     13 public:
     14     ListNode *partition(ListNode *head, int x)
     15     {
     16         if (!head)
     17         {
     18             return NULL;
     19         }
     20 
     21         bool flag; //第一个结点的值是否小于x
     22 
     23         if (head->val < x)
     24         {
     25             flag = true;
     26         }
     27         else
     28         {
     29             flag = false;
     30         }
     31 
     32         if (flag)
     33         {
     34             ListNode *less = head;
     35             ListNode *before = head;
     36             ListNode *current = head->next;
     37 
     38             while (current)
     39             {
     40                 if (current->val < x)
     41                 {
     42                     if (before != less)
     43                     {
     44                         before->next = current->next;
     45                         current->next = less->next;
     46                         less->next = current;
     47                         less = less->next;
     48                         current = before->next;
     49                     }
     50                     else
     51                     {
     52                         less = less->next;
     53                         before = before->next;
     54                         current = current->next;
     55                     }
     56                 }
     57                 else
     58                 {
     59                     before = before->next;
     60                     current = current->next;
     61                 }
     62             }
     63         }
     64         else
     65         {
     66             ListNode *greater = head;
     67             ListNode *before = head;
     68             ListNode *current = head->next;
     69 
     70             while (current)
     71             {
     72                 if (current->val >= x)
     73                 {
     74                     if (before != greater)
     75                     {
     76                         before->next = current->next;
     77                         current->next = greater->next;
     78                         greater->next = current;
     79                         greater = greater->next;
     80                         current = before->next;
     81                     }
     82                     else
     83                     {
     84                         greater = greater->next;
     85                         before = before->next;
     86                         current = current->next;
     87                     }            
     88                 }
     89                 else
     90                 {
     91                     before = before->next;
     92                     current = current->next;
     93                 }
     94             }
     95 
     96             if (before != greater) //表明该链表中存在小于x的结点,将它们放到大等于x结点的前面
     97             {
     98                 before->next = head;
     99                 head = greater->next;
    100                 greater->next = NULL;
    101             }
    102         }
    103 
    104         return head;
    105     }
    106 };
    View Code

    在网上还看到另一个思路,需要消耗O(n)的内存,自己创建两个链表,分别存放小于x和大等于x的结点,遍历一遍原来的序列后,将这两个链表合并一下即可

  • 相关阅读:
    2014-写给明年现在的自己
    DDD 领域驱动设计-Value Object(值对象)如何使用 EF 进行正确映射
    DDD 领域驱动设计-在动手之前,先把你的脑袋清理干净
    醍醐灌顶:领域驱动设计实现之路
    拨乱反正:DDD 回归具体的业务场景,Domain Model 再再重新设计
    设计窘境:来自 Repository 的一丝线索,Domain Model 再重新设计
    No zuo no die:DDD 应对具体业务场景,Domain Model 重新设计
    拨开迷雾,找回自我:DDD 应对具体业务场景,Domain Model 到底如何设计?
    【记录】GitHub/TortoiseGit 修改邮箱/提交者
    死去活来,而不变质:Domain Model(领域模型) 和 EntityFramework 如何正确进行对象关系映射?
  • 原文地址:https://www.cnblogs.com/laihaiteng/p/3936962.html
Copyright © 2011-2022 走看看