from __future__ import print_function # Time: O(n ^ 2) # Space: O(1) # # Sort a linked list using insertion sort. # # Definition for singly-linked list. class ListNode: def __init__(self, x): self.val = x self.next = None def __repr__(self): if self: return "{} -> {}".format(self.val, repr(self.next)) else: return "Nil" class Solution: # @param head, a ListNode # @return a ListNode def insertionSortList(self, head): if head is None or self.isSorted(head): return head dummy = ListNode(-2147483648) dummy.next = head cur, sorted_tail = head.next, head while cur: prev = dummy while prev.next.val < cur.val: prev = prev.next if prev == sorted_tail: cur, sorted_tail = cur.next, cur else: cur.next, prev.next, sorted_tail.next = prev.next, cur, cur.next cur = sorted_tail.next return dummy.next def isSorted(self, head): while head and head.next: if head.val > head.next.val: return False head = head.next return True if __name__ == "__main__": head = ListNode(3) head.next = ListNode(2) head.next.next = ListNode(1) print(Solution().insertionSortList(head))