86. Partition List

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;
	}
}
这题这么简单却因为一开始理不清题目想错浪费好多时间(捂脸


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值