- Insert into a Cyclic Sorted List
Given a node from a cyclic linked list which has been sorted, write a function to insert a value into the list such that it remains a cyclic sorted list. The given node can be any single node in the list. Return the inserted new node.
Example
Given a list, and insert a value 4:
3->5->1
Return 5->1->3->4
Notice
3->5->1 is a cyclic list, so 3 is next node of 1.
3->5->1 is same with 5->1->3
Solution:
这题很多情况需要处理,注意下面的input case:
- 10->1->2->4 10 //duplicate case 1
- 10->1->2->4->4->10->10 //duplicate case 2
- null 1
- 10 1 //single node case
- 2->2->2 3 // x > all the nodes, and all the nodes the same
- 3->5->1->2 7 //x > all the nodes
- 3->5->2->3 1 //x < all the nodes
注意 > 和 == 的情形最好分开写。
/**
* Definition of ListNode
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/*
* @param node: a list node in the list
* @param x: An integer
* @return: the inserted new list node
*/
ListNode * insert(ListNode * node, int x) {
ListNode *newNode = new ListNode(x);
if (!node) {
newNode->next = newNode;
return newNode;
}
ListNode *original = node;
//single node case
if (node->next == original) {
node->next = newNode;
newNode->next = node;
return newNode;
}
while(1) {
if (node->next == original) { //2->2->2 3
newNode->next = original->next;
original->next = newNode;
break;
}
if ((x == node->val) ||
((x > node->val) && (x < node->next->val)) ||
((node->val > node->next->val) && (x > node->val)) || //2->2->2 3
((node->val > node->next->val) && (x < node->next->val)) //2->2->2 1
) {
newNode->next = node->next;
node->next = newNode;
break;
}
node = node->next;
}
return newNode;
}
};