题目来源:https://leetcode.com/problems/partition-list/
问题描述
86. Partition List
Medium
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.
Example:
Input: head = 1->4->3->2->5->2, x = 3
Output: 1->2->2->4->3->5
------------------------------------------------------------
题意
给定一个无序链表和一个整数val,将链表重排,使得链表中<val的节点在>=val的节点之前。要求对于<val的节点和>=val的节点内部,不能改变节点在链表中的相对位置。
------------------------------------------------------------
思路
设置两个哑指针left和right分别指向<val的链表头和>=val的链表头,维护两个指针lprt和rptr在head指针遍历原链表的时候构造<val的左链表和>=val的右链表。然后再将lptr->next指向right->next将左右链表接上,并将rptr->next置为空。
------------------------------------------------------------
代码
/**
* Definition for a singly-linked list.
* class ListNode {
* public $val = 0;
* public $next = null;
* function __construct($val) { $this->val = $val; }
* }
*/
class Solution {
/**
* @param ListNode $head
* @param Integer $x
* @return ListNode
*/
function partition($head, $x) {
$left = new ListNode(0); // left dummy head
$right = new ListNode(0); // right dummy head
$lptr = $left;
$rptr = $right;
while ($head)
{
if ($head->val < $x)
{
$lptr->next = $head;
$head = $head->next;
$lptr = $lptr->next;
}
else
{
$rptr->next = $head;
$head = $head->next;
$rptr = $rptr->next;
}
}
$lptr->next = $right->next;
$rptr->next = null;
return $left->next;
}
}