剑指 Offer II 029. 排序的循环链表

题目:

 

思路:

【1】注意点:返回的要是一个环状的链表

代码展示:

//时间0 ms击败100%
//内存40.8 MB击败65.17%
//时间复杂度:O(n),其中 n 是链表的节点数。需要遍历链表一次寻找插入节点的位置,插入节点的时间是 O(1)。
//空间复杂度:O(1)
/*
// Definition for a Node.
class Node {
    public int val;
    public Node next;

    public Node() {}

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, Node _next) {
        val = _val;
        next = _next;
    }
};
*/
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 curr = head, next = head.next;
        while (next != head) {
            //如果符合升序规则则停下
            if (insertVal >= curr.val && insertVal <= next.val) {
                break;
            }
            //这种是说明遇到了类似[3,4,1],这种4与1的交界点
            if (curr.val > next.val) {
                if (insertVal > curr.val || insertVal < next.val) {
                    break;
                }
            }
            curr = curr.next;
            next = next.next;
        }
        curr.next = node;
        node.next = next;
        return head;
    }
}

 

posted @ 2023-03-10 11:06  忧愁的chafry  阅读(12)  评论(0编辑  收藏  举报