链表排序--Sort List

…衆ロ難τιáo~ 提交于 2020-04-07 05:54:57

https://leetcode.com/problems/sort-list/

Sort List

Sort a linked list in O(n log n) time using constant space complexity.

来自http://www.cnblogs.com/zuoyuan/p/3699508.html南郭子綦的解析

 题目:链表的排序。要求:时间复杂度O(nlogn),空间复杂度O(1)。

解题思路:由于题目对时间复杂度和空间复杂度要求比较高,所以查看了各种解法,最好的解法就是归并排序,由于链表在归并操作时并不需要像数组的归并操作那样分配一个临时数组空间,所以这样就是常数空间复杂度了,当然这里不考虑递归所产生的系统调用的栈。

       这里涉及到一个链表常用的操作,即快慢指针的技巧。设置slow和fast指针,开始它们都指向表头,fast每次走两步,slow每次走一步,fast到链表尾部时,slow正好到中间,这样就将链表截为两段。

 1 # Definition for singly-linked list.
 2 # class ListNode:
 3 #     def __init__(self, x):
 4 #         self.val = x
 5 #         self.next = None
 6 
 7 class Solution:
 8     # @param {ListNode} head
 9     # @return {ListNode}
10     def merge(self,head1,head2):
11         if head1==None: return head2
12         if head2==None: return head1
13         dummy=ListNode(0)
14         p=dummy
15         while head1 and head2:
16            if head1.val<head2.val:
17                p.next=head1
18                head1=head1.next
19                p=p.next
20            else:
21                p.next=head2
22                head2=head2.next
23                p=p.next
24         if head1==None:
25                p.next=head2
26         if head2==None:
27                p.next=head1
28         return dummy.next
29     def sortList(self, head):
30         if head==None or head.next==None: return head   #别忘记
31         slow=fast=head
32         while fast.next and fast.next.next:
33             slow=slow.next
34             fast=fast.next.next
35         head1=head                                      #快慢指针将链表截为两段
36         head2=slow.next
37         slow.next=None
38         head1=self.sortList(head1)                      #递归调用,直到2个或1个结点为止进行merge返回
39         head2=self.sortList(head2)
40         head=self.merge(head1,head2)
41         return head

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!