LeetCode——0147.对链表进行插入排序

147.对链表进行插入排序

题目

对链表进行插入排序。


插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。
每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。

 

插入排序算法:

插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
重复直到所有输入数据插入完为止。
 

示例 1:

输入: 4->2->1->3
输出: 1->2->3->4
示例 2:

输入: -1->5->3->4->0
输出: -1->0->3->4->5

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/insertion-sort-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解思路

1>源代码

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def insertionSortList(self, head: ListNode) -> ListNode:
        beforehead = ListNode(0)
        beforehead.next = head
        if (head == None):
            return head
        if (head.next == None):
            return head
        cur = head.next
        lastsort = head

        while (cur):
            if (lastsort.val <= cur.val):
                lastsort = lastsort.next
            else:
                pre = beforehead
                while (pre.next.val <= cur.val):
                    pre = pre.next
                lastsort.next = cur.next
                cur.next = pre.next
                pre.next = cur
            cur = lastsort.next
        return beforehead.next

2>算法介绍

这个题倒也没有特别难,但是我在做这道题的时候自以为是,觉得能不在纸上画链表模拟就完成代码,结果受到了惨痛的教训,可谓是事倍功半。从代码本身也可以看得出,需要维护的指针还是很多的,而且循环的边界条件也需要思考。长个教训吧,以后还是不偷懒了,至少在我 “真正” 熟练操作链表之前。

你可能感兴趣的:(LeetCode训练,leetcode,链表,算法,插入排序)