题目
1 2 3 4 5 6 7 8 9 10
| 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
示例 1:
输入: 4->2->1->3 输出: 1->2->3->4 示例 2:
输入: -1->5->3->4->0 输出: -1->0->3->4->5
|
题解
归并排序的首要就是将数据均分成两部分,如果是传统的数组的话,直接获取数组长度然后直接求出中点进行左右划分,但是链表的话,是没办法直接获取长度的(仅针对此题的链表数据结构),这时,可以利用快慢指针,来实现中点划分:设置快指针的速度是慢指针的两倍,那么,当快指针走到链表的末端时,慢指针的位置一定是链表的中点位置,这样就实现了归并的数据划分操作;剩下的,就和数组的归并排序差不多了,只不过,中间存放变量从数组变为了指针,因此需要确保每次merge的时候指针能够指向正确的位置即可
AC代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| class ListNode(object): def __init__(self, x): self.val = x self.next = None
class Solution(object): def sortList(self, head): """ :type head: ListNode :rtype: ListNode """ return None if head == None else self.mergeSort(node=head) def mergeSort(self, node): """ 快慢指针, """ if node.next == None: return node p = node; q = node; pre = None while q != None and q.next != None: pre = p p = p.next q = q.next.next pre.next = None l = self.mergeSort(node) r = self.mergeSort(p) return self.merge(l1=l, l2=r) def merge(self, l1, l2): node = ListNode(-1) tmp = node while l1 != None and l2 != None: if l1.val <= l2.val: tmp.next = l1 l1 = l1.next tmp = tmp.next else: tmp.next = l2 l2 = l2.next tmp = tmp.next while l1 != None: tmp.next = l1 l1 = l1.next tmp = tmp.next while l2 != None: tmp.next = l2 l2 = l2.next tmp = tmp.next tmp = None return node.next
|