原题链接:https://leetcode.com/problems/partition-list/
1. 题目介绍
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.
给定一个链表和值 x ,把链表中所有比 x 小的节点,排在所有比 x 大的节点的前面。相当于把链表分割成两个部分。一部分是比 x 小的,一部分是比 x 大的。并且在每个部分里面,需要保持链表节点的相对顺序不变。
Example:
Input: head = 1->4->3->2->5->2, x = 3
Output: 1->2->2->4->3->5
2. 解题思路
新建两个链表,链表 a 存放比 x 小的节点,链表 b 存放比 x 大的节点。遍历整个链表,如果遇到了小于 x 的节点,就将这个节点的值加入链表 a ,否则就将这个节点的值加入链表 b 。最后再将这两个链表拼接起来。
这样做既可以将链表分割,又能保证节点的相对顺序不变。
实现代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode partition(ListNode head, int x) {
if (head == null || head.next == null) {
return head;
}
ListNode assist = new ListNode(0);
assist.next = head;
ListNode cur = assist;
//新建链表存储比x小的数
ListNode LessThanX = new ListNode(0);
ListNode CurLess = LessThanX;
//新建链表存储大于等于x的数
ListNode MoreThanX = new ListNode(0);
ListNode CurMore = MoreThanX;
while(cur.next != null){
if(cur.next.val < x){
CurLess.next = new ListNode(cur.next.val);
CurLess = CurLess.next;
}else{
CurMore.next = new ListNode(cur.next.val);
CurMore = CurMore.next;
}
cur = cur.next;
}
//将两个链表拼接起来,小于x的链表在前,大于等于x的链表在后
CurLess.next = MoreThanX.next;
return LessThanX.next;
}
}