Leetcode 147.对链表进行插入排序
1 题目描述(Leetcode题目链接)
对链表进行插入排序。
插入排序算法:
- 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
- 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
- 重复直到所有输入数据插入完为止。
输入: 4->2->1->3
输出: 1->2->3->4
输入: -1->5->3->4->0
输出: -1->0->3->4->5
2 题解
用tail指向排序好的链表的末尾,如果遇到的新值比tail还大,那就直接tail向后移动,否则从头开始找插入位置,借助一个虚拟的头结点更方便实现节点插入。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def insertionSortList(self, head: ListNode) -> ListNode:
dummy = ListNode(0)
dummy.next = head
tail = head
while tail and tail.next:
if tail.next.val >= tail.val:
tail = tail.next
else:
p = dummy
while p.next.val < tail.next.val:
p = p.next
temp = tail.next
tail.next = temp.next
temp.next = p.next
p.next = temp
return dummy.next