一、题目描述
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
![](https://i-blog.csdnimg.cn/blog_migrate/cbd64554b303c88fa1e578f0ae63900a.png)
示例 1:
输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]
示例 2:
输入:head = [2,1], x = 2
输出:[1,2]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/partition-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、运行结果
![](https://i-blog.csdnimg.cn/blog_migrate/6cd51949f5e5c32453f79f2f117a6eaf.png)
三、解题思路
创建两个新的表头结点,将原链表分成两个新的链表,其中一个链表保存比x小的结点lessList,另外一个链表保存大于等于x的结点largeList,遍历原链表的每个结点,如果当前节点p的值比x小,就将当前结点加入到lessList链表的末尾,如果当前结点的值大于等于x,就将当前结点加入到largeList链表的末尾。
遍历完原链表中的每个结点之后,将大数链表链接到小数字链表的末尾(去掉自己创建的头结点)。
四、AC代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode partition(ListNode head, int x) {
ListNode lessList = new ListNode(-1); // 小数字链表表头
ListNode largeList = new ListNode(-1); // 大数字链表表头(大于x的数)
ListNode p = head, rLess = lessList, rLarge = largeList;
while(p != null){
ListNode tmp = p.next;
if(p.val < x){ // 将p结点加到小数字链表的末尾
rLess.next = p;
rLess = rLess.next;
}else { //将p结点加到大数字链表的末尾
rLarge.next = p;
rLarge = rLarge.next;
}
p.next = null;
p = tmp;
}
rLess.next = largeList.next; //将大数链表连到小数链表后面
return lessList.next;
}
}