leetcode142 对链表进行插入排序

题目

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

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

思路

设置一个新的链表。遍历旧链表,每一个节点都作为一个新节点,按序插入新链表中。
从链表头部开始遍历,记录当前要插入排序的节点和其上一个节点,对每个节点执行如下操作:

  • 从头部开始找到当前节点之前第一个不大于它的节点,记录找到的节点以及它前一个节点
  • 如果它前一个节点为空,说明要插入到头节点之前,若不为空,则插入到该节点之后
  • 继续进行下一次插入排序,直到遍历到链表尾部
class Solution:
    def insertionSortList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        p= new_s= ListNode(None)
        new_s.next = head
        cur = head
        while cur and cur.next:
            val = cur.next.val
            if val > cur.val:
                cur = cur.next
                continue
            if p.next.val>val:
                p = new_s
            while p.next.val <val:
                p = p.next
            new = cur.next
            cur.next = new.next
            new.next = p.next
            p.next = new
        return new_s.next

猜你喜欢

转载自blog.csdn.net/lgy54321/article/details/84961211