题解 | #划分链表#

划分链表

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即可
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;
    }
}





全部评论

相关推荐

搜索部&nbsp;首先说下timeline8.18,投递8.19,约一面8.21,晚上一面call约二面8.22,上午二面下午oc周末等待(8.23,8.24)8.25,offer一年前,我还是懵懵懂懂,高考完的暑假,只会提前学学高数,未来的画像是什么?我或许无法预测。开学后,自学Python,接单,无数个客户的ddl,偷偷摸摸一个人找自习的地方,这一步步竟然为后来的我,搭建工程能力的基础。大一上,我也要感谢我的第一位老板,让我接触到了实习,师兄带着我一步步入门,看他们写的飞书文档。大一下,导师带我参与企业项目,这让我渐渐发现,应该去实践,增长见识,而非局限当下,盯着自己的小新pro。不久后,第一波投递开始,结果当然是约面极少。盯着简历上的文字和ssob,我开始思考,确实很多可以去提升。带着些许不甘心,继续沉淀,慢慢的约面也越来越多,有的时候两天7场,准备完就接着下一个日程。这一次,也许是刚好到位吧,比较match,面试答的流利,关关难关关过,成为度孝子展望未来,依然是重重挑战,果然只有收到offer的那一刻是开心的。愿在百度星海拆解的每一段代码,都能成为丈量宇宙的诗行;此志终赴星河,而今迈步重铸天阶。屏幕前的你们,在无数个向星海奔赴的日夜,一定一定,会在未来化作群星回响的征程——请永远相信此刻埋首耕耘的自己!!!
一天三顿半:???百度提前批发 offer了?不是统一和正式批排序完再发吗我靠
百度求职进展汇总
点赞 评论 收藏
分享
做个有文化的流氓:Offer收割机
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务