码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode - Partition List

时间:2014-08-26 13:08:16      阅读:401      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   color   os   io   for   ar   

题目: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、注意一下边界情况即可

代码:

bubuko.com,布布扣
  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的结点,遍历一遍原来的序列后,将这两个链表合并一下即可

leetcode - Partition List

标签:des   style   blog   http   color   os   io   for   ar   

原文地址:http://www.cnblogs.com/laihaiteng/p/3936962.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!