题目如果不进行思考,巨多坑。
首先我们需要找到列表中的最小值,最大值这个节点,因为找到后可以与我们的新元素进行比较厚插入。
找到最小值,最大值需要循环一遍列表,如果当前cur元素的值<nex元素的值,说明后一个节点更大,让nex = cur,继续循环,直到nex=<cur,那么就找到cur为最大值,nex为最小值。
坑1,列表为【3,3,3】,列表会无限循环,因此加一个条件nex != head
坑2,列表为【3,3,3,5,3】,错把第一个3当做列表开头,因此条件变为当前cur元素的值=<nex元素的值
接下来分情况讨论,新元素插在列表最前面,最后面还是中间呢?
class Solution:
def insert(self, head: 'Optional[Node]', insertVal: int) -> 'Node':
#algo: relative
if not head:
node = Node(insertVal)
node.next = node
return node
# find first minimal
cur = head
while cur.val <= cur.next.val and cur.next != head:
cur = cur.next
tail = cur
pre = cur.next
new = Node(insertVal)
if pre.val >= insertVal:
new.next = pre
tail.next = new
elif tail.val <= insertVal:
tail.next = new
new.next = pre
else:
cur = pre
while cur.next.val < insertVal:
cur = cur.next
nex = cur.next
cur.next = new
new.next = nex
return head