原题: https://leetcode-cn.com/problems/partition-list/
一、题目要求
给你一个链表的头节点 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
二、解题
package com.leetcode.test.linklist;
/**
* 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
*/
public class Solution12 {
public static void main(String[] args) {
ListNode a1 = new ListNode(1);
ListNode a2 = new ListNode(4);
ListNode a3 = new ListNode(3);
ListNode a4 = new ListNode(2);
ListNode a5 = new ListNode(5);
ListNode a6 = new ListNode(2);
a1.next = a2;
a2.next = a3;
a3.next = a4;
a4.next = a5;
a5.next = a6;
ListNode l = partition(a1, 3);
while (l != null) {
System.out.print(l.val + " ");
l = l.next;
}
}
/**
* 新建两个链表,然后遍历原链表,遇到小于x的放入第一个链表,遇到大于或等于的放入第二个链表
* 然后将两个链表连接起来
*/
public static ListNode partition(ListNode head, int x) {
ListNode smallList = new ListNode();
ListNode smallListCur = smallList; //第一个链表的当前位置
ListNode bigList = new ListNode();
ListNode bigListCur = bigList; //第二个链表的当前位置
while (head != null){
int val = head.val;
ListNode node = new ListNode(val);
if (val < x){
smallListCur.next = node;
smallListCur = node;
} else {
bigListCur.next = node;
bigListCur = node;
}
head = head.next;
}
//最后,将第一个链表的尾结点指向第二个链表的头结点
smallListCur.next = bigList.next;
//返回第一个链表的头结点
return smallList.next;
}
}