We use two points to point to two successive nodes, we call them "pre" and "cur"
We need to consider 3 situation need to be considered:
1. the inserted node is between two nodes values -> pre<=insert && insert<=cur
2. the inserted node is larger than all nodes, we need to find the edge of the circle where the pre is larger then cur -> pre>cur && insert>pre
3. the inserted node is smaller than all nodes, we need to find the edge of the circle where the pre is larger then cur -> pre>cur && insert<cur
class Solution { public Node insert(Node head, int insertVal) { if(head==null){ Node insert = new Node(insertVal); insert.next = insert; return insert; } Node insert = new Node(insertVal); Node pre = head, cur = head.next; while(cur!=head){ if(pre.val<=insertVal&&insertVal<=cur.val ||pre.val>cur.val&& insertVal<cur.val ||pre.val>cur.val&& insertVal>pre.val){ insertNode(pre, cur, insert); return head; } cur=cur.next; pre=pre.next; } insertNode(pre, cur, insert); return head; } private void insertNode(Node pre, Node cur, Node insert){ pre.next = insert; insert.next = cur; } }
Or the following codes are more clear and simple:
class Solution { public Node insert(Node head, int insertVal) { Node newNode = new Node(insertVal); if(head==null){ newNode.next = newNode; return newNode; } Node cur = head.next; Node prev = head; while(cur!= head){ if(prev.val <= insertVal && insertVal<= cur.val){ break; } if( prev.val > cur.val && insertVal > prev.val ){ break; } if( prev.val > cur.val && insertVal < cur.val){ break; } prev = cur; cur=cur.next; } prev.next = newNode; newNode.next = cur; return head; } }