leetcode 【 Insertion Sort List 】 python 实现

题目

Sort a linked list using insertion sort.

代码:oj测试通过 Runtime: 860 ms

 1 # Definition for singly-linked list.
 2 # class ListNode:
 3 #     def __init__(self, x):
 4 #         self.val = x
 5 #         self.next = None
 6
 7 class Solution:
 8     # @param head, a ListNode
 9     # @return a ListNode
10     def insertionSortList(self, head):
11
12
13         if head is None or head.next is None:
14             return head
15
16         dummyhead = ListNode(0)
17         dummyhead.next = head
18
19         curr = dummyhead.next
20         while curr.next is not None:
21             if curr.next.val < curr.val:
22                 pre = dummyhead
23                 while pre.next.val < curr.next.val:
24                     pre = pre.next
25                 tmp = curr.next
26                 curr.next = tmp.next
27                 tmp.next = pre.next
28                 pre.next = tmp
29             else:
30                 curr = curr.next
31
32         return dummyhead.next

思路

首先要知道插入排序的原理。

对于单链表来说,需要做指针的交换。

小白记忆插入排序的原理只有一句话:类比扑克牌抓牌,把牌按大小插入。

需要注意的地方是

不要加多余的判断,否则会超时;第一次运行的时候,我在里面的while循环条件判断上加了一句 pre != curr,结果就报超时了。

check一下逻辑,发现完全是无用判断浪费时间,去掉后就通过了。

时间: 2024-08-22 03:56:09

leetcode 【 Insertion Sort List 】 python 实现的相关文章

[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

class Solution { public: ListNode *insertionSortList(ListNode *head) { if (head == NULL) return NULL; ListNode* sorted_head = head; ListNode* unsorted_head = head->next; head->next = NULL; ListNode* cur = unsorted_head; while (cur != NULL) { unsorte

leetcode——Insertion Sort List 对链表进行插入排序(AC)

Sort a linked list using insertion sort. class Solution { public: ListNode *insertionSortList(ListNode *head) { if(head == NULL || head->next == NULL) return head; ListNode *result; result->val = INT_MIN; result->next = NULL; ListNode *cur=head,*

LeetCode :: Insertion Sort List [详细分析]

Sort a linked list using insertion sort. 仍然是一个非常简洁的题目,让我们用插入排序给链表排序:这里说到插入排序,可以来回顾一下, 最基本的入门排序算法,就是插入排序了:时间复杂度为n^2,最基本的插入排序是基于数组实现的,下面给出基于数组实现的插入排序,来体会一个插入排序的思想: 以下仅为数组实现,不是解题代码,没兴趣可以跳过. void insertionsort (int a[], int N) { for (int i = 1; i < N; i+

LeetCode: Insertion Sort List [147]

[题目] 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]Insertion Sort

Sort a linked list using insertion sort. 这道题是要求用插入排序的方式对单链表进行排序. 先不考虑边界情况: 1. 将第一个结点看做有序区,之后的所有结点看做无序区. 2. 从第二个结点p开始,遍历有序区,知道遇到比结点p值大的结点q,将结点p插入到结点q之前. 3. 重复上述步骤直到链表遍历结束. 需要注意的是: 1. 遍历无序区时,需要保存当前结点的后继结点,以防指针丢失. 2. 若原链表为空,则直接返回NULL. 下面贴上代码: /** * Defi

LeetCode Insertion Sort List 链表插入排序

题意:给一个链表,实现插入排序. 思路:O(1)空间,O(n*n)复杂度.将排好的用另一个链表头串起来,那个链表头最后删掉,再返回链表. 1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 pub

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,那么

【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; * } * }