【LeetCode】每日一题:剑指Offer ll 029.排序的循环链表,清晰易理解:先找到最小节点,再寻找应当插入的位置



一、思路

目标明确:先找到最小节点,再寻找应当插入的位置,特别地要注意当插入值是比 最大值还大的值 或者 是比最小值还小的值 的处理,注意避免进入死循环!!,代码中已经给出详细注释~

二、代码实现

class Solution {
    public Node insert(Node head, int insertVal) {
        if(head == null) {
            Node node =  new Node(insertVal);
            node.next = node;
            return node;
        }
        Node cur = head;

        while (true){ // 寻找最小节点
            int preNum = cur.val;
            cur = cur.next;
            if (cur.val < preNum //由于链表为非递减链表,故当节点值小于其父节点值时即此节点为最小节点
                || cur == head   // 特殊情况,若循环一一圈都没找到,说明此时head就指向最小节点
                ){
                break;
            }
        }
        // 开始插入节点
        Node begin = cur; // 记录最小节点
        while (true){
            if (insertVal == cur.val // 当插入值与当前节点值相等时
                    || (insertVal > cur.val && insertVal < cur.next.val // // 此插入值应当插入在两个节点之间
                    || cur.next == begin // 此时说明插入值是比最大值还大的值或者是比最小值还小的值,应当插入在最小节点的与最大节点之间
                    )){
                Node node = new Node(insertVal);
                node.next = cur.next;
                cur.next = node;
                break;
            }
            
            cur = cur.next;
        }
        return head;
    }
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值