'''
leetcode 147. 对链表进行插入排序
插入排序算法的时间复杂度为 O(n**2),无需使用额外的空间
'''
# Definition for singly-linked list.
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def insertionSortList(self, head: ListNode) -> ListNode:
if head is None or head.next is None:
return head
output=ListNode(-float('inf'))
output.next=head
head=head.next
before=output
temp=output.next
tail=output.next # tail指针指向排序好的链表尾部的节点
sorted_num=1
while(head):
length=sorted_num
while(length>0 and head.val>temp.val):
before=before.next
temp=temp.next
length-=1
if length==0:
# 说明当前待插入节点的数值比已经排序好的链表中的所有数值都大
before.next=head
tail=head
head=head.next
else:
curr=head.next
# 将head节点插入到before节点和temp节点之间
head.next=temp
before.next=head
# temp.next=curr
head=curr
tail.next=head
sorted_num+=1
before=output
temp=output.next
return output.next
if __name__=="__main__":
start=ListNode(-float('inf'))
temp=start
for elem in [-1,5,3,4,0]:
new_node=ListNode(elem)
temp.next=new_node
temp=temp.next
output=Solution().insertionSortList(start.next)
while(output):
print(output.val)
output=output.next