题解 | #划分链表#
划分链表
http://www.nowcoder.com/practice/1dc1036be38f45f19000e48abe00b12f
双指针+尾插法:时间复杂度O(n),空间复杂度O(1)
思路:通过定位下标,不停往中间尾插小于目标值的数
如何定位下标?为什么要这么定位?为什么要使用尾插法
如例子:1,4,3,2(1),5,2(2)|3
好好思考下,是不是只需要定位两个指针到1,4一直往里面插后面小于3的元素就行了。如何找,相邻指针左边小于3,右边大于3
题目所说的是,相对位置不变,那是不是采用尾插法就行了?
尾插法:1 2(1) 4 3 5 2-> 1 2(1)2(2)4 3 5
为什么要用哨兵?(针对一开始就大于x的值)
55,56,58,20,50,30|40 这种情况,如果按照初时下标找法是不是找到的是20,50两个位置
再采用尾插法是不是就是 55 56 58 20 30 50,明显得到的结果不符合题意
针对一开始就大于x的值,我们可以构建一个哨兵,哨兵的值小于K,我们来看
(哨兵)39 55 58 20 50 30|40,是不是开始定位是定位在39 和 55上,最终结果 39 20 30 55 58 50,剔除39即可
如例子:1,4,3,2(1),5,2(2)|3
好好思考下,是不是只需要定位两个指针到1,4一直往里面插后面小于3的元素就行了。如何找,相邻指针左边小于3,右边大于3
题目所说的是,相对位置不变,那是不是采用尾插法就行了?
尾插法:1 2(1) 4 3 5 2-> 1 2(1)2(2)4 3 5
为什么要用哨兵?(针对一开始就大于x的值)
55,56,58,20,50,30|40 这种情况,如果按照初时下标找法是不是找到的是20,50两个位置
再采用尾插法是不是就是 55 56 58 20 30 50,明显得到的结果不符合题意
针对一开始就大于x的值,我们可以构建一个哨兵,哨兵的值小于K,我们来看
(哨兵)39 55 58 20 50 30|40,是不是开始定位是定位在39 和 55上,最终结果 39 20 30 55 58 50,剔除39即可
import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * } */ public class Solution { /** * * @param head ListNode类 * @param x int整型 * @return ListNode类 */ //双指针+尾插法 public ListNode partition (ListNode head, int x) { if(head==null||head.next==null){ return head; } // write code here //构建哨兵 ListNode numpy = new ListNode(x-1); numpy.next = head; ListNode nodePre = numpy; ListNode nodeNext = numpy.next; //找到nodePre<x 和 nodeNext>=x的值然后在中间不停插入 while(nodeNext!=null){ if(nodePre.val<x&&nodeNext.val>=x){ break; } nodePre=nodePre.next; nodeNext=nodeNext.next; } while(nodeNext!=null){ //nodeNext的下一个如果是小于x是不是就是要拿出来的值 if(nodeNext.next!=null&&nodeNext.next.val<x){ //找到要拿出来的值 ListNode temp = nodeNext.next; //nodeNext断开与拿出来的值的联系 nodeNext.next=nodeNext.next.next; //插入到nodePre 和 nodePre.next中间 temp.next = nodePre.next; nodePre.next=temp; //这里很关键:如果不写这一步就是头插法,写了这一步就是尾插法 //假设:1 3 4 5 6 此时nodePre在1上, nodePre.next在3上,nodeNext.next是4,此时要将4插入1,3 //经历了上述代码以后1 4 3 5 6 此时nodePre在1上,nodePre.next在4上,当我要继续插入5的时候,是不是就会往1,4插 //但是如果跟新了nodepre为4以后,nodePre在4上,nodePre.next在3上,继续往里面插是不是就是插入在4后了,好好理解 nodePre =nodePre.next; } else{ //如果不满足,nodeNext继续找下一个节点 nodeNext=nodeNext.next; } } return numpy.next; } }