题目
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 = 3Output: 1->2->2->4->3->5
题意
给定一个链表和目标值x,将链表中所有值小于x的结点移到所有值大于等于x的结点的前面,同时不能改变值小于/大于等于x的结点的相对位置。
思路
新建两个头结点分别用来保存原链表中值小于x的结点和值大于等于x的结点,最后将两链表相连即为所求的新链表。
代码实现
Java
class Solution {public ListNode partition(ListNode head, int x) {// 建空的头结点便于处理ListNode leftHead = new ListNode(0), leftTail = leftHead;ListNode rightHead = new ListNode(0), rightTail = rightHead;while (head != null) {if (head.val < x) {leftTail.next = head;leftTail = head;} else {rightTail.next = head;rightTail = head;}head = head.next;}rightTail.next = null; // 注意断链,否则可能会形成环leftTail.next = rightHead.next; // 拼接链表return leftHead.next;}}
JavaScript
/*** @param {ListNode} head* @param {number} x* @return {ListNode}*/var partition = function (head, x) {const dummyA = new ListNode()const dummyB = new ListNode()let A = dummyAlet B = dummyBwhile (head) {const next = head.nexthead.next = nullif (head.val < x) {A.next = headA = A.next} else {B.next = headB = B.next}head = next}A.next = dummyB.nextreturn dummyA.next}
