问题描述 :
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0
输出: -1->0->3->4->5
可使用以下代码,完成其中的sortList函数,其中形参head指向无头结点单链表。
#include
using namespace std;
struct ListNode
{
int val;
ListNode *next;
ListNode() : val(0), next(NULL) {}
ListNode(int x) : val(x), next(NULL) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
class Solution {
public:
ListNode* sortList(ListNode* head)
{
//填充本函数完成功能
}
};
ListNode *createByTail()
{
ListNode *head;
ListNode *p1,*p2;
int n=0,num;
int len;
cin>>len;
head=NULL;
while(n<len && cin>>num)
{
p1=new ListNode(num);
n=n+1;
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
}
return head;
}
void displayLink(ListNode *head)
{
ListNode *p;
p=head;
cout<<"head-->";
while(p!= NULL)
{
cout<<p->val<<"-->";
p=p->next;
}
cout<<"tail\n";
}
int main()
{
ListNode* head = createByTail();
head=Solution().sortList(head);
displayLink(head);
return 0;
}
输入说明 :
首先输入链表长度len,然后输入len个整数,以空格分隔。
输出说明 :
输出格式见范例
输入范例 :
5
-1 5 3 4 0
输出范例 :
head–>-1–>0–>3–>4–>5–>tail
思想:归并排序
快慢指针找到链表中间节点,然后按照这个中间节点划分为左右两部分
最后合并左右两部分
*/
#include<iostream>
#include<vector>
using namespace std;
struct ListNode
{
int val;
ListNode *next;
ListNode() : val(0), next(NULL) {}
ListNode(int x) : val(x), next(NULL) {}
};
class Solution
{
public:
ListNode* sortList(ListNode* head)
{
//快慢指针找到中间节点
ListNode *slow = head,*fast = head,*pre = NULL; //pre为slow的前驱,以下这个循环结束时,pre指向中点
while(fast && fast->next)
{
pre = slow;
slow = slow->next;
fast = fast->next->next;
}
pre->next = NULL;
//递归左右子表
ListNode *left = sortList(head);
ListNode *right = sortList(slow);
//合并结果
return mergeTwoLists(left,right);
}
//合并两个有序链表,使合并后的链表任然有序
ListNode *mergeTwoLists(ListNode *left,ListNode *right){
ListNode dummy = (0); //临时头节点,方便操作
ListNode *pre = &dummy;
while(left && right)
{
if(left->val < right->val)
{
pre->next = left;
left = left->next;
}
else
{
pre->next = right;
right = rigth->next;
}
pre = pre->next;
}
//左表还有剩余节点
if(left)
{
pre->next = left;
}
//右表还有剩余结点
if(right)
{
pre->next = right;
}
return dummy.next;
}
};
ListNode *createByTail()
{
ListNode *head;
ListNode *p1,*p2;
int n=0,num;
int len;
cin>>len;
head=NULL;
while(n<len && cin>>num)
{
p1=new ListNode(num);
n=n+1;
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
}
return head;
}
void displayLink(ListNode *head)
{
ListNode *p;
p=head;
cout<<"head-->";
while(p!= NULL)
{
cout<<p->val<<"-->";
p=p->next;
}
cout<<"tail\n";
}
int main()
{
ListNode* head = createByTail();
head=Solution().sortList(head);
displayLink(head);
return 0;
}