Sort List: Total Accepted: 8953 Total Submissions:45805
Sort a linked list in O(n log n) time using constant space complexity.
Solution4.h
#include <stdio.h>
#include <iostream>
#include <string>
//#include <vector>
#include <stdlib.h>
using namespace std;
struct ListNode
{
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution4
{
public:
Solution4();
~Solution4();
ListNode *sortList(ListNode *head);
ListNode *mergesort(ListNode *head);
ListNode *merge(ListNode *h1, ListNode *h2);
};
Solution4.cpp:
#include "Solution4.h"
//#include <cmath>
using namespace std;
//#include <stack>
Solution4::Solution4()
{
}
Solution4::~Solution4()
{
}
ListNode* Solution4::sortList(ListNode *head)
{
return mergesort(head);
}
ListNode* Solution4::mergesort(ListNode *head_1)
{
if (head_1==NULL || head_1->next==NULL)
return head_1;
ListNode *p=head_1;
ListNode *q=head_1;
ListNode *pre=p;
while (q!=NULL && q->next!=NULL)
{
//q每次移动两步,p移动一步,当q到大链表末尾时,p到达链表中间
q=q->next->next;
pre=p;
p=p->next;
}
pre->next=NULL;
ListNode *h1=mergesort(head_1);
ListNode *h2=mergesort(p);
return merge(h1,h2);
}
ListNode* Solution4::merge(ListNode *h1, ListNode *h2)
{
ListNode *dump=new ListNode(0);
ListNode *p=dump;
while (h1!=NULL && h2!=NULL)
{
if (h1->val< h2->val)
{
p->next=h1;
h1=h1->next;
}
else
{
p->next=h2;
h2=h2->next;
}
p=p->next;
}
if (h1!=NULL)
p->next=h1;
else p->next=h2;
ListNode *head=dump->next;
delete dump;
return head;
}
main.cpp:
#include "Solution4.h"
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
//Solution4:
Solution4 mysolution4;
ListNode *head, *tail, *p, *temp;
int i=0;
head=tail=NULL;//开始都初始化是NULL
printf("input a number\n");
for(; i<6; i++)
{
printf("Please enter %dth Node data:",i);
p=(ListNode *)malloc(sizeof(ListNode));//动态的构造一块内存空间,返回的是指向接点的指针
scanf("%d",&p->val);;//赋值
p->next=NULL;
if(head==NULL)
head=tail=p;//在头指针是NULL时候也就是说是一个空的单链,那么头尾都赋值是指针p
else
//tail=tail->next;//当头指针不是指向NULL时候的话,就是说这个链是存在的,现在是加进去尾指针就向下进一个
tail->next=p; //注意此处以及下面一句
tail=p;//把尾指针的下一个赋值是新建的这个指针(创建单向链表)
}
ListNode *mysort=mysolution4.sortList(head);
temp=(ListNode *)malloc(sizeof(ListNode));
while (NULL != mysort)
{
//cout<<mysort->val<<endl;
temp = mysort->next;
cout<<mysort->val<<endl;
mysort = temp;
}
return 0;
system("pause");
}
总结:
主要考察对链表的掌握。之前对链表只是了解一点,通过这次对链表的排序等有了一定掌握。排序方法用的是上篇博文提到的归并法。
除了leetcode部分的代码,测试函数main.cpp中链表的初始化也需要注意。另外就是开始在 ListNode* Solution4::mergesort(ListNode *head_1) 中
while (q!=NULL && q->next!=NULL)
{
//q每次移动两步,p移动一步,当q到大链表末尾时,p到达链表中间
q=q->next->next;
pre=p;
p=p->next;
}
循环中第二句与第三句颠倒了顺序,导致stackoverflow错误,后来检查才发现。