letcode 排序的循环链表

题目链接
分析:其实一共就这么几种情况
情况一:
当前值 < insertVal,并且下一个值 >insertVal,那么insertVal肯定在这两个中间
情况二:
当前值 == insertVal,那么直接让insertVal是当前值的下一个
情况三:比最大值还大或者还小,那么找到当前值大于当前值的下一个的节点,那么当前节点就是之前链表中值最大的,那么将当前节点的下一个置为insertVal,此时insertVal可以是最大值也可以是最小值
情况四:所有链表中值都相等,那么随便插入insertVal即可。
情况五:head空
情况六:只有一个节点
代码:

class Solution {
    public Node insert(Node head, int insertVal) {
        Node node = new Node(insertVal);
        //情况五
        if(head==null){
            node.next = node;
            return node;
        }
        //情况六
        if(head.next==head){
            head.next = node;
            node.next = head;
            return head;
        }
        Node p = head;
        Node p1 = head;
        while(true){
        	//情况一 和 情况二
            if(p.val==node.val || (p.val<node.val && p.next.val>node.val) ){
                node.next = p.next;
                p.next = node;
                return head;
            }
            p = p.next;
            if(p==p1){
                break;
            }
        }
        if(p==p1){
            while(true){
            	//情况三
                if(p.next.val<p.val){
                    node.next = p.next;
                    p.next = node;
                    return head;
                }
                p=p.next;
                if(p==p1){
                    break;
                }
            }
        }
        //情况四
        if(p==p1){
            node.next = head.next;
            head.next = node;
        }
        return head;
    }
}

还有一种思路,就是先找到真正的头节点,就是找到最小值,然后将insertVal插入

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值