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
.
题目大概是意思就是 遍历链表,小于给定值的,排在给定值的前面,大于等于给定值的,排在给定值后面,保持原来链表中的顺序,意思就是不能进行排序。
但是看了题目给定的例子,发现,return 的时候4会排在3前面,觉得很奇怪,写的时候走了很多弯路,后来发现,是自己想错了,题目中是大于或等于给定值的,排在后面,而自己的思维老是理解成按链表的顺序,小于给定值的,排在前面,大于给定值的排在后面,给定值排在中间,所以才会觉得例子给的有问题。
第一次写的时候,按照原来那种错误的想法,在遍历链表的时候,将小于给的值的,存在一个链表A中,大于给定值的,存在另一个链表B中,等于给定值的存在链表C中,最后在合并,但是自己老是被绕进去了,写出的答案都错了,索性用下面的方法去处理,先用list存,之后在合并,虽然能ac,但是速度很慢
class Solution {
public ListNode partition(ListNode head, int x) {
if (head == null)
return null;
List<Integer> l1 = new ArrayList<>();
List<Integer> l2 = new ArrayList<>();
ListNode s = head, temp = null, h = temp;
while (s != null) {
if (s.val < x) {
l1.add(s.val);
}
if (s.val >= x) {
l2.add(s.val);
}
s = s.next;
}
int j = 0, k = 0;
if (l1.size() > 0)
{
temp = new ListNode(l1.get(0));
j = 1;
}
if(l1.size() == 0 && l2.size() > 0)
{
temp = new ListNode(l2.get(0));
k = 1;
}
h = temp;
for (; j < l1.size(); j++)
{
ListNode l = new ListNode(l1.get(j));
temp.next = l;
temp = temp.next;
}
for (; k < l2.size(); k++)
{
ListNode l = new ListNode(l2.get(k));
temp.next = l;
temp = temp.next;
}
temp.next = null;
return h;
}
}
第二种方法,在遍历链表的时候就开始处理要返回的链表了,将小于给定值的存在一个链表A中,大于或等于给定值的,存在链表B中,最后合并返回,提交后发现也没快多少(捂脸
class Solution {
public ListNode partition(ListNode head, int x) {
if (head == null)
return null;
ListNode s = head;
ListNode h1 = new ListNode(0);
ListNode h2 = new ListNode(0);
ListNode p1 = h1, p2 = h2;
while(s!=null)
{
if(s.val < x)
{
ListNode l1 = new ListNode(s.val);
p1.next = l1;
p1 = p1.next;
}
else
{
ListNode l2 = new ListNode(s.val);
p2.next = l2;
p2 = p2.next;
}
s = s.next;
}
p2.next = null;
p1.next = h2.next;
return h1.next;
}
}
这题这么简单却因为一开始理不清题目想错浪费好多时间(捂脸