1. 概述

给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。 你应当保留两个分区中每个节点的初始相对位置。

示例:

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

输出: 1->2->2->4->3->5

2. 解题

  1. <?php
  2. class ListNode
  3. {
  4. public $val = 0;
  5. /** @var ListNode */
  6. public $next = null;
  7. function __construct($val)
  8. {
  9. $this->val = $val;
  10. }
  11. }
  12. class Solution
  13. {
  14. /**
  15. * 1->4->3->2->5->2
  16. * @param ListNode $head
  17. * @param Integer $x
  18. * @return ListNode
  19. */
  20. public function partition($head, $x)
  21. {
  22. $dummy = new ListNode(0);
  23. $dummy->next = $head;
  24. $smallErgodic = $bigErgodic = $dummy;
  25. $small = $big = null;
  26. $smallIndex = $bigIndex = 0;
  27. $j = $i = 0;
  28. /** @var ListNode $smallHome 小于$x的数应该插入的位置节点 */
  29. $smallHome = null;
  30. while (1) {
  31. // 取出小于$x的节点
  32. while ($smallErgodic->next && !$small) {
  33. if ($smallErgodic->next->val < $x) {
  34. $small = $smallErgodic->next;
  35. $smallIndex = $i;
  36. }
  37. $smallErgodic = $smallErgodic->next;
  38. $i++;
  39. }
  40. // 取出大于$x的节点
  41. while ($bigErgodic->next && !$big) {
  42. if ($bigErgodic->next->val >= $x) {
  43. $big = $bigErgodic->next;
  44. $bigIndex = $j;
  45. }
  46. $bigErgodic = $bigErgodic->next;
  47. $j++;
  48. }
  49. // 如果已经没有符合条件的情况,这跳出程序
  50. if (!$small || !$big) {
  51. break;
  52. }
  53. if ($smallIndex < $bigIndex) {
  54. $smallHome = $small;
  55. } else {
  56. // 小的数前移
  57. $tmp = $smallHome->next;
  58. $smallHome->next = new ListNode($small->val);
  59. $smallHome->next->next = $tmp;
  60. // 删除小的数
  61. $big->next = $big->next->next;
  62. }
  63. $smallIndex = $bigIndex = 0;
  64. $small = $big = null;
  65. }
  66. return $dummy->next;
  67. }
  68. }
  69. $head = new ListNode(1);
  70. $head->next = new ListNode(4);
  71. $head->next->next = new ListNode(3);
  72. $head->next->next->next = new ListNode(2);
  73. $head->next->next->next->next = new ListNode(5);
  74. $head->next->next->next->next->next = new ListNode(2);
  75. $x = 3;
  76. $cls = new Solution();
  77. $ret = $cls->partition($head, $x);
  78. print_r($ret);