题目:

    Sort a linked list using insertion sort.

    大意是要实现一个链表的插入排序

算法思路:

    从原链表中逐个弹出一个node

    对于每一个node用插入排序的思想插入新的升序排列的链表中

    这里有一个小trick,leetcode有一组数据是1~4999的升序序列,如果我们采用如上方法会超时

    于是我们在插入排序的时候设置一个last位,记录当前插入的位置

    在下一次插入的时候与上次插入位置last比较,如果当前node.val > last.val,那么我们只有从last开始查找即可,因为前面的节点val都比node节点val小,没有查找的必要。


代码:

class Solution(object):
    def addInList(self, head, last, node):
        iterator = head
        if last.val <= node.val:
            iterator = last

        while iterator.next:
            if iterator.next.val > node.val:
                node.next = iterator.next
                iterator.next = node
                return iterator
            iterator = iterator.next

        iterator.next = node
        return iterator


    def insertionSortList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """

        if head == None or head.next == None:
            return head

        start = ListNode(-2147483648)
        last = start

        while head:
            next = head.next
            head.next = None
            last = self.addInList(start, last, head)
            head = next

        return start.next