[各种面试题] 链表归并排序

本文介绍了一种基于链表的归并排序算法实现。通过递归地将链表分为两半,分别对左右两部分进行排序,最后再将两个有序链表合并成一个有序链表。文章提供了完整的 C++ 实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有一个链表,然后请对它进行排序;

这里先写了一个归并排序;

#include<iostream>
#include<vector>
#include<algorithm>
#include<ctime>
using namespace std;

struct ListNode
{
	int val;
	ListNode* next;
};
int getLength(ListNode* head);
void mergeSort(ListNode*& head, ListNode*& first,ListNode*& tail,int n );
void merge(ListNode* lH,ListNode* rH,ListNode*& first,ListNode*& tail);
ListNode* sortLinkList(ListNode *head) {
	if ( !head ) 
		return head;
	int n =getLength(head);
	ListNode* first=NULL, *tail=NULL;
	mergeSort(head,first,tail,n);
	return first;
}
int getLength(ListNode* head)
{
	int n=0;
	while(head)
	{
		n++;
		head=head->next;
	}
	return n;
}
void mergeSort(ListNode*& head, ListNode*& first,ListNode*& tail,int n )
{
	if ( !head || n<=0 )
		return;
	if ( n== 1 )
	{
		first=tail=head;
		return;
	}
	int half= n>>1;
	ListNode* lHead=NULL, *lTail=NULL;
	mergeSort(head,lHead,lTail,half);
	head=lTail->next;
	ListNode* rHead=NULL,*rTail=NULL;
	mergeSort(head,rHead,rTail,n-half);
	ListNode* rest=NULL;
	if ( lTail ) {rest=lTail->next;lTail->next=NULL;}
	if ( rTail ) {rest=rTail->next;rTail->next=NULL;}
	merge(lHead,rHead,first,tail);
	tail->next=rest;
}
void merge(ListNode* lH,ListNode* rH,ListNode*& first,ListNode*& tail)
{
	ListNode guard;
	tail=&guard;
	ListNode tmp;
	tmp.val=INT_MAX;
	while( lH || rH )
	{
		ListNode* toAdd=&tmp;
		if ( lH && lH->val <toAdd->val)
			toAdd=lH;
		if ( rH && rH->val < toAdd->val ) 
			toAdd=rH;
		if ( toAdd == lH )
			lH=lH->next;
		else 
			rH=rH->next;

		tail->next=toAdd;
		tail=tail->next;
	}
	first=guard.next;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值