python实现链表的删除_leetcode的python实现(148)排序链表

【排序链表】


题目描述

在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0
输出: -1->0->3->4->5


思路使用归并排序,归并排序分为两步,1.找到待排序链表的中间节点(使用快慢指针法,leetcode 876题)2.合并两个有序链表(leetcode 21题),因此本题相当于结合这两步来实现链表排序。
# Definition for singly-linked list.class ListNode:    def __init__(self, x):        self.val = x        self.next = Noneclass Solution:    def sortList(self, head: ListNode) -> ListNode:        # if not head or not head.next:#        if head == None or head.next == None:            return head         slow  = head#快慢指针法找到链表中点        fast = head        while fast.next and fast.next.next:            slow = slow.next            fast = fast.next.next        right = slow.next        # print(right.val)        slow.next = None #这一句的原因是 需要对中点前的链表进行割断处理        l1 = self.sortList(head)#递归保证l1和l2为有序链表        l2 = self.sortList(right)        return self.mergeTwoLists(l1,l2)# 合并两个有序链表    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:        if not l1 and not l2:            return None        if not l1:            return l2        if not l2:            return l1        head = head1 = ListNode(0)        while l1 and l2:            if l1.val <= l2.val:                head.next = l1                l1 = l1.next            else:                head.next = l2                l2 = l2.next            head = head.next        if not l1 : head.next = l2        if not l2 : head.next = l1        return head1.next
测试
if __name__ == "__main__":    n1 = ListNode(4)    n2 = ListNode(7)    n3 = ListNode(6)    n4 = ListNode(9)    n5 = ListNode(12)    m=n1    n1.next=n2    n2.next=n3    n3.next=n4    n4.next=n5    print('原链表的节点:')        while m:        print('节点%d的值:'%(m.val),m.val)        m=m.next    print('\n排序之后的节点:')    s=Solution()    s.sortList(n1)    while n1:        print('节点%d的值:'%(n1.val),n1.val)        n1=n1.next#result原链表的节点:节点4的值: 4节点7的值: 7节点6的值: 6节点9的值: 9节点12的值: 12排序之后的节点:节点4的值: 4节点6的值: 6节点7的值: 7节点9的值: 9节点12的值: 12

点击左下角【阅读原文】查看leetcode官网本题描述

【往期文章回顾】

链表

1. 剑指offer的python实现(1)-从尾到头打印链表的值

2. 剑指offer的python实现(6)-反转链表

3. 剑指offer的python实现(15)-链表中倒数第k个结点

4. 剑指offer的python实现(16)-合并两个排序的链表

5. 剑指offer的python实现(18)-删除链表中重复的结点

6. 剑指offer的python实现(20)-链表中的环的入口接点

7. 剑指offer的python实现(23)-两个链表的第一个公共结点

8. 剑指offer的python实现(27)-复杂链表的复制

9. 剑指offer的python实现(29)-二叉搜索树与双向链表

10. leetcode-19. 删除链表的倒数第N个节点

11. leetcode的python实现-(206)反转链表和(92)反转链表II

12. leetcode的python实现-(876)链表的中间结点


二叉树

1. 剑指offer的python实现(3)-重建二叉树

2. 剑指offer的python实现(4)-二叉树层级遍历

3. 剑指offer的python实现(5)-二叉搜索树的后序遍历序列

4. 剑指offer的python实现(21)-二叉树的镜像

5. 剑指offer的python实现(22)-树的子结构

6. 剑指offer的python实现(25)-二叉树中和为某一值的路径

7. 剑指offer的python实现(30)-二叉树的深度

8. 剑指offer的python实现(33)-平衡二叉树

9. 剑指offer的python实现(38)-二叉树的下一个结点

10. 剑指offer的python实现(39)-对称的二叉树

11. 剑指offer的python实现(40)-二叉搜索树的第k个结点

12. leetcode-二叉树的前、中、后序遍历和层序遍历python实现

13. leetcode-N叉树的前、后序遍历和层序遍历python实现

14. leetcode(98)-验证二叉搜索树

15. leetcode(235)python实现- 二叉搜索树的最近公共祖先


数组

1. leetcode(560)python实现-和为k的子数组

2. 剑指offer的python实现(46)-构建乘积数组

3. 剑指offer的python实现(35)-把数组排成最小的数

4. 剑指offer的python实现(32)-连续子数组的最大和

5. 剑指offer的python实现(31)-数组中出现次数超过一半的数字

6. 剑指offer的python实现(17)-调整数组奇偶数顺序

7. 剑指offer的python实现(9)-旋转数组的最小数字

8. 找出一维数组中的重复值-python实现


字符串

1. 剑指offer的python实现(36)-第一个只出现一次的字符位置

2. 剑指offer的python实现(42)-左旋转字符串

3. 剑指offer的python实现(45)-把字符串转换成整数


栈和队列

1. 剑指offer的python实现(7)-用两个栈实现队列

2. 剑指offer的python实现(8)-栈的压入弹出序列

3. 剑指offer的python实现(28)-包含min函数的栈


递归和循环

1. 剑指offer的python实现(10)-斐波那契数列

2. 剑指offer的python实现(11)-跳台阶

3. 剑指offer的python实现(12)-变态跳台阶


排序算法

1. 冒泡排序、选择排序、插入排序、快速排序的python实现
2. 归并排序、堆排序的python实现

3. 计数排序、桶排序、基数排序的python实现


长按二维码关注公众号,获取更多内容

cfb2a3c5cbca1b6d66ae0395663e9bab.png

点击留言

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值