c++单链表的归并排序
时间: 2023-05-28 12:07:10 浏览: 126
单链表的归并排序是一种常见的排序算法,它通过分治的思想将链表分成若干个子链表,然后对每个子链表进行排序,最后将这些有序的子链表合并成一个有序的链表。
具体实现步骤如下:
1. 定义一个函数merge(head1, head2),用于将两个有序链表head1和head2合并成一个有序链表,并返回合并后的链表头节点。
2. 定义一个函数sortList(head),用于将链表head排序,并返回排序后的链表头节点。排序的具体实现可以按以下步骤进行:
a. 如果链表为空或只有一个节点,则直接返回。
b. 定义两个指针slow和fast,分别指向链表头节点和中间节点。使用快慢指针的方法将链表分成两个子链表。
c. 递归调用sortList函数对两个子链表进行排序。
d. 调用merge函数将两个有序的子链表合并成一个有序的链表,并返回合并后的链表头节点。
3. 最后,调用sortList函数对整个链表进行排序即可。
下面是单链表的归并排序的Python代码实现:
```python
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
def merge(head1, head2):
if not head1:
return head2
if not head2:
return head1
if head1.val < head2.val:
head1.next = merge(head1.next, head2)
return head1
else:
head2.next = merge(head1, head2.next)
return head2
def sortList(head):
if not head or not head.next:
return head
slow, fast = head, head.next
while fast and fast.next:
slow = slow.next
fast = fast.next.next
mid = slow.next
slow.next = None
left = sortList(head)
right = sortList(mid)
return merge(left, right)
```
时间复杂度:O(nlogn)。
空间复杂度:O(logn),因为归并排序使用了递归,所以需要O(logn)的栈空间。
阅读全文