【LeetCode每天一题】Insertion Sort List(使用插入法对链表进行排序)

Sort a linked list using insertion sort.

Example 1:

Input: 4->2->1->3
Output: 1->2->3->4

Example 2:

Input: -1->5->3->4->0
Output: -1->0->3->4->5

思路

  这道题意思就是让你使用插入排序来对链表进行排序,根据插入排序在数组的思想,我们可以知道他是将数组分成两部分,排序好的,未排序的。我们每次都从没排序的数组中提取一个数字将其插入到排序好的数组。直到未排序的数组个数为0。如果将其运用到链表中,其思想也是一样的可以详细见图示步骤和解决代码。时间复杂度为O(n2), 空间复杂度为O(1)图示步骤


解决代码



 1 # Definition for singly-linked list.
 2 # class ListNode(object):
 3 #     def __init__(self, x):
 4 #         self.val = x
 5 #         self.next = None
 6
 7 class Solution(object):
 8     def insertionSortList(self, head):
 9         """
10         :type head: ListNode
11         :rtype: ListNode
12         """
13         if not head:
14             return head
15         cur = head
16         while cur.next:     # 循环结束条件
17             if cur.next.val < cur.val:       # 如果下一个节点的值比当前节点值大,则需要将其插入到相应的位置
18                 tem_cur = cur.next            # 将cur.next节点独立出来,
19                 cur.next = cur.next.next       # 后cur.next下一个节点连接起来。
20                 tem_head = head
21                 if tem_head.val >= tem_cur.val:    # 从头节点开始查找合适的插入位置,如果cur.next的值小于头节点的值直接插入到头节点中。
22                     tem_cur.next = head
23                     head = tem_cur
24                 else:                                # 否者遍历查找合适的位置
25                     while tem_head.next.val < tem_cur.val:
26                         tem_head = tem_head.next
27                     t_next = tem_head.next             # 将节点插入到合适的位置
28                     tem_head.next = tem_cur
29                     tem_cur.next = t_next
30             else:                         # 说明cur.next的值大于cur的值,更新cur的值,直接遍历下一个节点
31                 cur = cur.next
32         return head                    # 返回头节点。

原文地址:https://www.cnblogs.com/GoodRnne/p/10972677.html

时间: 2024-10-09 00:33:54

【LeetCode每天一题】Insertion Sort List(使用插入法对链表进行排序)的相关文章

leetcode_147题——Insertion Sort List(线性表,插入排序)

Insertion Sort List Total Accepted: 40386 Total Submissions: 154512My Submissions Question Solution Sort a linked list using insertion sort. Hide Tags Linked List Sort Have you met this question in a real interview? Yes No Discuss 这道题没啥好说的,主要是考察线性表的操

LeetCode第[88]题(Java):Merge Sorted Array(合并已排序数组)

题目:合并已排序数组 难度:Easy 题目内容: Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. 翻译: 给定两个排序的整数数组nums1和nums2,将nums2合并到nums1中作为一个排序数组. 注意: nums1和nums2中初始化的元素数量分别为m和n. nums1有足够的空间(大小大于或等于m+n)来容纳nums2中的额外元素. 我的思路:此处和归

[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

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] 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之Insertion Sort List

Sort a linked list using insertion sort. 这道题是用链表做插入排序.虽然之前数据结构中学习了链表的插入删除等,但那些都是最简单的基本操作,只是给出一个节点,直接给出插入位置. 首先,插入排序的思想是,每次将一个元素插入到前面已排序的有序的链表中,因此首先要找到需要插入的元素,如果链表的链接顺序是按照生序排列的话直接continue 当找到要插入的元素时,即第一个使得无序的元素.首先应该记录下当前元素的位置,以及该元素之前的位置. 其次开始从头遍历已排序的前

147. Insertion Sort List

题目: Sort a linked list using insertion sort. 思路: 链表的插入排序和数组的插入排序略有不同.以链表4->2->3->1->5为例,为方便操作添加一个头节点-1,此时链表为-1->4->2->3->1->5.基本思路为一次选择前后两个节点,若后节点大于前节点则不断向后循环,若后节点小于前节点则取出后节点,并插入到头节点和前节点之间的位置. 举例说明: 头节点为-1,cur为节点4,nextnode为节点2.此

【leetcode刷题笔记】Insertion Sort List

Sort a linked list using insertion sort. 题解:实现链表的插入排序. 要注意的地方就是,处理链表插入的时候尽量往当前游标的后面插入,而不要往前面插入,后者非常麻烦.所以每次利用kepeler.next.val和head.val比较大小,而不是kepeler.val和head.val比较大小,因为如果用后者,要把head指向的节点插入到kepeler指向的节点的前面,如果kepeler指向的节点是头结点,就更麻烦了. 代码如下: 1 /** 2 * Defi

[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