Insert into a Sorted Circular Linked List

medium linked list

Problem

Insert val into a sorted circular singly linked list. The list may be empty.

Inputlist circular: 3→4→1→3 ; insert 2
Output3→4→1→2→3
Wraps around if needed.

def insert(head, val):
    node = Node(val)
    if not head: node.next = node; return node
    p = head
    while True:
        if p.val <= val <= p.next.val: break
        if p.val > p.next.val and (val >= p.val or val <= p.next.val): break
        p = p.next
        if p == head: break
    node.next = p.next; p.next = node; return head
function insert(head, val) {
  const node = new Node(val);
  if (!head) { node.next = node; return node; }
  let p = head;
  do {
    if (p.val <= val && val <= p.next.val) break;
    if (p.val > p.next.val && (val >= p.val || val <= p.next.val)) break;
    p = p.next;
  } while (p !== head);
  node.next = p.next; p.next = node;
  return head;
}
Node insert(Node head, int val) {
    Node node = new Node(val);
    if (head == null) { node.next = node; return node; }
    Node p = head;
    do {
        if (p.val <= val && val <= p.next.val) break;
        if (p.val > p.next.val && (val >= p.val || val <= p.next.val)) break;
        p = p.next;
    } while (p != head);
    node.next = p.next; p.next = node;
    return head;
}
Node* insert(Node* head, int val) {
    Node* node = new Node(val);
    if (!head) { node->next = node; return node; }
    Node* p = head;
    do {
        if (p->val <= val && val <= p->next->val) break;
        if (p->val > p->next->val && (val >= p->val || val <= p->next->val)) break;
        p = p->next;
    } while (p != head);
    node->next = p->next; p->next = node;
    return head;
}
Time: O(n) Space: O(1)