给你一个链表的头节点 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
题解,嗯,简单直白双指针的解法,另外加一个链表常用小技巧虚拟头结点。
因为头结点可能会被替换掉,所以再加一个虚拟头结点来链接到真正的头结点,这样可以保证有效快速的找到真正的新的头结点。
第一个指针,从虚拟头结点开始,一直往后跑,找到第一个大于等于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用户
发表评论