【牛客网练习】链表分割

链接:
原题出处
来源:牛客网

[编程题] 链表分割
热度指数:43019时间限制:3秒空间限制:32768K
算法知识视频讲解

编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前

给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。

思路:

一看到这道题我就想到了创建两个链表的想法,一个链表放小于指定x的所有节点,另一个放大于等于的,最后将两个链表合二为一不就是要求的结果吗

注意:

(1)记住两个链表的头节点,在拼接时需要用到
(2)考虑空异常

未实现的思路:
既然可以这样弄两个链表,那么为什么不这样(创建一个链表就可以)呢?

将小于x的节点头插到该链表,大于等于的尾插到该链表,最后形成的链表不就是答案吗。

代码

我实现的是两个链表的(可以优化的地方:将尾插算法抽取出来为一个方法):

   public ListNode partition(ListNode pHead, int x) {
        // write code here
        ListNode left = null;
        ListNode right = null;
        ListNode p1 = null;
        ListNode p2 = null;
        while(pHead!=null){
            if(pHead.val<x){
                if(left == null){
                    left = new ListNode(pHead.val);
                    p1 = left; //左链表的头节点
                }else{
                    left.next = new ListNode(pHead.val);
                    left = left.next;
                }
            }else{
                if(right == null){
                    right = new ListNode(pHead.val);
                    p2 = right;    //右链表的头节点
                }else{
                    right.next = new ListNode(pHead.val);
                    right = right.next;
                }
            }
            pHead = pHead.next;
        }

        if(p1==null){
            return p2;
        }
        if(p2==null){
            return p1;
        }
        //走到这里说明都不为空,需要连接
        //找到左链表的最后一个节点将其与右链表连接
        ListNode cur = p1;
        while(cur.next!=null){
            cur = cur.next;
        }
        cur.next = p2;
        return p1;
    }

如果有错误还望指出!

发布了57 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42419462/article/details/103303540