目录
定义链表类
struct ListNode
{
int val;
ListNode *next;
ListNode(int x): val(x), next(NULL) {}
};
递归法
需要几个辅助函数:
1)找到单链表的中间节点
ListNode *findMiddle(ListNode *head)
{
ListNode *middle = head;
ListNode *runner = head->next;
while(runner != NULL && runner->next != NULL)
{
middle = middle->next;
runner = runner->next->next;
}
return middle;
}
2)合并两个有序的链表(这里给出非递归合并,递归版参看https://blog.csdn.net/Doutd_y/article/details/81545308)
ListNode *mergeTwoLists(ListNode *l1, ListNode *l2)
{
if (l1 == NULL)
return l2;
if (l2 == NULL)
return l1;
ListNode *pre = new ListNode(0);
ListNode *head = pre;
while (l1 != NULL && l2 !=NULL)
{
if(l1->val > l2->val)
{
head->next = l2;
l2 = l2->next;
}
else
{
head->next = l1;
l1 = l1->next;
}
head = head->next;
}
if (l1 == NULL)
{
head->next = l2;
}
if (l2 == NULL)
{
head->next = l1;
}
return pre->next;
}
3)递归合并排序
ListNode *sortList(ListNode *head)
{
if (head == NULL || head->next == NULL)
{
return head;
}
ListNode *middle = findMiddle(head);
ListNode *right = sortList(middle->next);
middle->next = NULL;
ListNode *left = sortList(head);
return mergeTwoLists(left, right);
}
主函数调用:
int main()
{
ListNode n1(3), n2(4), n3(2), n4(1), n5(5);
n1.next = &n2;
n2.next = &n3;
n3.next = &n4;
n4.next = &n5;
ListNode *head = NULL;
head = sortList(&n1);
ListNode *head1;
head1 = newHead;
while (head != NULL)
{
cout << head ->val << endl;
head = head ->next;
}
return 0;
}