Design Skiplist — LeetCode 1206 Python Solution
HardDesignLinked List
- Problem
- #1206
- Pattern
- Linked List
- Reading time
- 11 min
- Source
- leetcode.com
The problem
Design a Skiplist without using any built-in libraries. A skiplist is a data structure that takes O(log(n)) time to add, erase and search.
Example
- Input
- ["Skiplist", "add", "add", "add", "search", "add", "search", "erase", "erase", "search"]
- Output
- [null, null, null, null, false, null, true, false, true, false]
- Explanation
- Skiplist skiplist = new Skiplist();
Python solution
Python
class Node:
__slots__ = ['val', 'next']
def __init__(self, val: int, level: int):
self.val = val
self.next = [None] * level
class Skiplist:
max_level = 32
p = 0.25
def __init__(self):
self.head = Node(-1, self.max_level)
self.level = 0
def search(self, target: int) -> bool:
curr = self.head
for i in range(self.level - 1, -1, -1):
curr = self.find_closest(curr, i, target)
if curr.next[i] and curr.next[i].val == target:
return True
return False
def add(self, num: int) -> None:
curr = self.head
level = self.random_level()
node = Node(num, level)
self.level = max(self.level, level)
for i in range(self.level - 1, -1, -1):
curr = self.find_closest(curr, i, num)
if i < level:
node.next[i] = curr.next[i]
curr.next[i] = node
def erase(self, num: int) -> bool:
curr = self.head
ok = False
for i in range(self.level - 1, -1, -1):
curr = self.find_closest(curr, i, num)
if curr.next[i] and curr.next[i].val == num:
curr.next[i] = curr.next[i].next[i]
ok = True
while self.level > 1 and self.head.next[self.level - 1] is None:
self.level -= 1
return ok
def find_closest(self, curr: Node, level: int, target: int) -> Node:
while curr.next[level] and curr.next[level].val < target:
curr = curr.next[level]
return curr
def random_level(self) -> int:
level = 1
while level < self.max_level and random.random() < self.p:
level += 1
return level
# Your Skiplist object will be instantiated and called as such:
# obj = Skiplist()
# param_1 = obj.search(target)
# obj.add(num)
# param_3 = obj.erase(num)Complexity
| Measure | Complexity |
|---|---|
| Time | O(n) |
| Space | O(n) auxiliary |
Pattern: Linked List
Rewire pointers in place, with a dummy head and a saved next to keep it safe. LeetCode 1206. Design Skiplist is filed here on both counts: the reference solution below belongs to the algorithm family this hub collects, and LeetCode tags it Linked List.
The linked list guide has the Python template for the pattern and the 75 LeetCode problems that use it.
Related problems
Frequently asked questions
- How hard is LeetCode 1206. Design Skiplist?
- LeetCode 1206. Design Skiplist is rated Hard on LeetCode.
- What is the time complexity of LeetCode 1206. Design Skiplist?
- The Python solution on this page runs in O(n).
- What is the space complexity of LeetCode 1206. Design Skiplist?
- The Python solution on this page uses O(n) auxiliary space.
- What topics does LeetCode 1206. Design Skiplist cover?
- LeetCode 1206. Design Skiplist is tagged Design and Linked List on LeetCode.