每日一题20201120(147. 对链表进行插入排序)

简介: 对链表进行插入排序

147. 对链表进行插入排序


3.jpg

image-20201120134633194

思路



维护一个排好序的链表,剩下的值如果比已排好的大,直接放到尾部,如果比之前小,则从链表头遍历,找到对应的位置并插入。
为了很好找到链表头,需要设置一个哑节点。


# 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:
        # 1. 如果链表为空,直接return None
        if head is None:
            return None
        # 2. 创建一个哑节点, 指向head
        pre = ListNode(0)
        pre.next = head
        # 3. sorted_data为已经排好序的数据,current为当前要排序的元素
        sorted_data = head
        current = head.next
        # 4. 循环的结束条件是current走到None也就是走到最后一个元素
        while current is not None:
            # 当最后一个排好序的元素的值比待排序的值小,则sorted_data后移一位
            if sorted_data.val <= current.val:
                sorted_data = sorted_data.next
            else:
                # prev为头节点,为了不影响哑节点
                prev = pre
                # 找到排好序的第一个大于当前值的节点
                while prev.next.val <= current.val:
                    prev = prev.next
                # 这里要注意,prev目前指向的是第一个大于当前值的节点
                # 这里sorted_data.next = current.next
                # 是因为当前值总是在sorted_data的下一位
                # 这里相当于是把当前节点撤下,挪到前面去
                sorted_data.next = current.next
                current.next = prev.next
                prev.next = current
            # 当前节点继续走,往后挪一位
            current = sorted_data.next
        # 返回哑节点的下一位即可
        return pre.next

4.jpg

image-20201120144152739



相关文章
|
18天前
|
C语言
对链表使用插入排序的C语言实现示例
对链表使用插入排序的C语言实现示例
|
3月前
|
Java Go C++
Golang每日一练(leetDay0116) 路径交叉、回文对
Golang每日一练(leetDay0116) 路径交叉、回文对
30 0
Golang每日一练(leetDay0116) 路径交叉、回文对
|
3月前
|
算法 C++ Go
Golang每日一练(leetDay0050) 对链表进行插入排序、排序链表、直线上最多的点、逆波兰表达式
Golang每日一练(leetDay0050) 对链表进行插入排序、排序链表、直线上最多的点、逆波兰表达式
30 0
Golang每日一练(leetDay0050) 对链表进行插入排序、排序链表、直线上最多的点、逆波兰表达式
|
3月前
|
算法 JavaScript
JS算法-链表插入排序
JS算法-链表插入排序
|
4月前
|
算法 搜索推荐 vr&ar
☆打卡算法☆LeetCode 147. 对链表进行插入排序 算法解析
☆打卡算法☆LeetCode 147. 对链表进行插入排序 算法解析
|
6月前
|
算法
【Leetcode -147.对链表进行插入排序 -237.删除链表中的节点】
【Leetcode -147.对链表进行插入排序 -237.删除链表中的节点】
15 0
|
存储 算法
ARTS-3-算法练习-基于链表的插入排序和链表重排
ARTS-3-算法练习-基于链表的插入排序和链表重排
102 0
|
C++
【LeetCode147】对链表进行插入排序
The number of nodes in the list is in the range [1, 5000]. -5000 <= Node.val <= 5000
71 0
【LeetCode147】对链表进行插入排序
[LintCode] 链表插入排序
1 /** 2 * Definition of ListNode 3 * class ListNode { 4 * public: 5 * int val; 6 * ListNode *next; 7 * ListNode(int v...
766 0