leetcode 147. Insertion Sort List (Python版)

题目:

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
时间: 2024-10-17 22:16:12

leetcode 147. Insertion Sort List (Python版)的相关文章

Leetcode 147. Insertion Sort List 插入排序 in Java

147. Insertion Sort List Total Accepted: 80869 Total Submissions: 263074 Difficulty: Medium Sort a linked list using insertion sort. /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { va

Java for LeetCode 147 Insertion Sort List

Sort a linked list using insertion sort. 解题思路: 插入排序,JAVA实现如下: public ListNode insertionSortList(ListNode head) { if(head==null||head.next==null) return head; ListNode root=new ListNode(Integer.MIN_VALUE); root.next=head; head=head.next; root.next.nex

[LeetCode] 147. Insertion Sort List 解题思路

Sort a linked list using insertion sort. 问题:实现单向链表的插入排序. 这是比较常规的一个算法题目. 从左往右扫列表,每次将指针的下一个元素插入前面已排好序的对应位置中. 需要注意的一定是,列表只能定位下一个元素,不能定位前一个元素,所有,每次插入位置的适合,都是对左右指针的下一个元素进行操作. 1 void insertSort(ListNode* p1, ListNode* p2){ 2 ListNode* next2 = p2->next; 3 p

LeetCode 147. Insertion Sort List

最简单的思路,另开一个list,初始化为仅有head一个节点,head移动到下一个节点.然后开始比较head和tmp的val大小,如果head小,那么插在最前面(注意保持tmp为表头),如果head大,那么tmp一直遍历至表尾或至节点值比head大处. 89ms 1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x

[leetcode]Insertion Sort List @ Python

原题地址:http://oj.leetcode.com/problems/insertion-sort-list/ 题意:对链表进行插入排序. 解题思路:首先来对插入排序有一个直观的认识,来自维基百科. 代码循环部分图示: 代码: class Solution: # @param head, a ListNode # @return a ListNode def insertionSortList(self, head): if not head: return head dummy = Lis

【LeetCode】Insertion Sort List

题目 Sort a linked list using insertion sort. 解答 链表无法像数组那样从后往前依次比较插入,只能从前往后:在链表首部添加一个哨兵可以稍微简化下代码,代码如下: /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * }

[LeetCode 题解]: Insertion Sort List

Sort a linked list using insertion sort. 题目要求:链表的插入排序,由于没有时间复杂度的要求,可以直接循环操作. /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode

LeetCode OJ - Insertion Sort List

题目: Sort a linked list using insertion sort. 解题思路: 假设 list[1..i]是排好序的,找到第i+1个元素应该插入的位置及其前驱,然后将其插入. 代码: /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class S

[leetcode sort]147. Insertion Sort List

Sort a linked list using insertion sort. 利用插入排序对一个链表进行排序 思路和数组中的插入排序一样,不过每次都要从链表头部找一个合适的位置,而不是像数组一样可以从要插入的位置开始从后往前找合适的位置 1 class Solution(object): 2 def insertionSortList(self, head): 3 dummy = ListNode(-1) 4 dummy.next,cur= head,head 5 while cur and