算法学习打卡计划

leetcode第一百四十八题—排序链表

2020-04-19  本文已影响0人  不分享的知识毫无意义

排序链表有很多种解法,最简单的遍历链表,变成list然后list.sort,再变回有序链表就好了。但是这种做法没有意义,对数据结构没有很好的理解。

1.题目

原题

反转一个单链表。

例子

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

2.解析

链表排序的写法也很多,比如归并,插入排序都可以,笔者也是一一更新。

2.1归并排序

归并排序用到了递归,想想列表的归并排序,有拆分和归并两部分,拆分不用说了就是递归调用讲列表进行二分,直到不可再分了。并的过程就是将拆分过程中形成的左右两个列表进行大小比较和合并。涉及到链表要考核链表的特点:

3.python代码

##归并排序
class Solution:
    def merge(self, left, right):
        # if not left:
        #     return right
        # if not right:
        #     return left
        out = ListNode(0)
        h = out
        while left and right:
            if left.val < right.val:
                h.next = left
                left = left.next
            else:
                h.next = right
                right = right.next
            h = h.next#为了更新h
        h.next = left if left else right
        return out.next

    def sortList(self, head):
        if head is None or head.next is None:
            return head
        slow = head
        fast = head
        pre = None
        while fast and fast.next:#andzu作用是为了不用到fast.next
            pre = slow
            slow = slow.next
            fast = fast.next.next
        mid = slow#slow是重点
        pre.next = None
        # while mid:
        #     print('mid',mid.val)
        #     mid = mid.next
        pre.next = None
        return self.merge(self.sortList(head), self.sortList(mid))
上一篇下一篇

猜你喜欢

热点阅读