给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。

你应当 保留 两个分区中每个节点的初始相对位置。

 

示例 1:

输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]

示例 2:

输入:head = [2,1], x = 2
输出:[1,2]

 

提示:

  • 链表中节点的数目在范围 [0, 200]
  • -100 <= Node.val <= 100
  • -200 <= x <= 200
Related Topics
  • 链表
  • 双指针

  • 👍 454
  • 👎 0
  • 题解,嗯,简单直白双指针的解法,另外加一个链表常用小技巧虚拟头结点。

    因为头结点可能会被替换掉,所以再加一个虚拟头结点来链接到真正的头结点,这样可以保证有效快速的找到真正的新的头结点。

    第一个指针,从虚拟头结点开始,一直往后跑,找到第一个大于等于x值的之前的节点。

    第二个指针,从头结点开始往后遍历,找到比x小的值,把这个比x小的值的前一个节点指向当前节点的后一个节点,这样后面这块的粘合工作就算完成了。另一部分,把之前找到的第一个指针的next节点指向当前节点,并将当前节点的next指向原来第一个指针的后一个节点

    举例说明【F,1,4,3,2,5,2】,x=3

    最开始的时候第一个指针找到了1节点,因为后面的4比3大,此时可以保证这个1和之前的节点都比x小,所以从x开始往后找小于3的节点。

    一直找到了2节点,把3节点的next指向2后面的5

    把之前的1节点的next指向到2,把2的next指向到1节点原来的next节点4,并把第一个指针往后移动一位移动到2的位置,因为2也比3小

    此时新的顺序【F,1,2,4,3,5,2】

    继续这个过程往后找到另一个2节点

    把2的前一个节点的next指向到2的后面的节点NULL,

    把之前第一个指针的2的next指向到这里的2,并把这里的2的next指向到原来的2的next节点4,并把第一个指针往后移动一位到这个新的2节点

    此时新的顺序【F,1,2,2,4,3,5】,最后指针移动到NULL,结束。

    返回原来的虚拟节点的next节点。

    class Solution {
        public ListNode partition(ListNode head, int x) {
            if (head == null || head.next ==null)return head;
            ListNode fakeHead = new ListNode();
            fakeHead.next = head;
            ListNode smallerTail = fakeHead;
            while (smallerTail!=null && smallerTail.next != null && smallerTail.next.val < x){
                smallerTail = smallerTail.next;
            }
            if (smallerTail.next == null){
                return head;
            }
            ListNode current = smallerTail;
            while (current != null){
                if (current.next!=null && current.next.val < x){
                    ListNode tmp1 = smallerTail.next;
                    ListNode tmp2 = current.next;
                    current.next = current.next.next;
                    smallerTail.next = tmp2;
                    tmp2.next = tmp1;
                    smallerTail = smallerTail.next;
                }else{
                    current = current.next;
                }
            }
            return fakeHead.next;
        }
    }

    收工!~

    解答成功:
    执行耗时:0 ms,击败了100.00% 的Java用户
    内存消耗:37.5 MB,击败了88.81% 的Java用户