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.
For example, Given 1->4->3->2->5->2 and x = 3, return 1->2->2->4->3->5.
一.目的:
依据目标数对链表进行划分、排序
二.思路:
新建两个链表,一个储存值小于X的,另外一个储存值大于等于X的,用一次while循环遍历链表将节点分别插入到这两个链表中,最后连接这两个链表。
三.易错点:
最后在大于等于X的那个链表最后的节点后应该加一个指向null,否则会溢出。因为每次传入的都是一串链表,而不仅仅是一个节点。
更好理解的写法是在 if 判断语句处分别 加上 left.next = null 和 right.next = null;
代码如下:
/**
* Definition for ListNode.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int val) {
* this.val = val;
* this.next = null;
* }
* }
*/
public class Solution {
/**
* @param head: The first node of linked list.
* @param x: an integer
* @return: a ListNode
*/
public ListNode partition(ListNode head, int x) {
// write your code here
if(head == null){
return null;
}
ListNode leftDummy = new ListNode(0);
ListNode rightDummy = new ListNode(0);
ListNode left = leftDummy , right = rightDummy;
while(head != null){
if(head.val < x){
left.next = head;
left = left.next;
}else{
right.next = head;
right = right.next;
}
head = head.next;
}
left.next = rightDummy.next;
right.next = null;
return leftDummy.next;
}
}