LeetCode problem 4:Sort List

来源:互联网 发布:起爆点指标公式源码 编辑:程序博客网 时间:2024/06/08 11:24

思路:这道题目主要考链表的操作,由于很久没有写链表了,这道题目花费的时间不少,主要是一些边界条件的考虑、指针的操作等等。指针的操作是个非常重要的基本功,我就是指针操作悲剧了许久 T_T。另外由于题目对时间的要求是O(nlogn)的复杂度,这个我直接能够想到的就是归并排序,由于是链表排序,所以取数组的一半可以通过两个指针来跑,跑在前面的指针是后面指针“速度”的一倍就可以了,等前面的指针跑完了,后面的指针就是大概在链表中的一半,刚好!

如果这道题目调试指针操作许久,所以代码的调试语句也不去了,这个足以说明本人这指针水平实在是太渣了,切记,注意引用变量的使用!

code:

#include<iostream>#include<iomanip>#include<cmath>#include<string>#include<stack>#include<vector>#include<map>#include<algorithm>using namespace std;struct Point {   int x;       int y;       Point() : x(0), y(0) {}       Point(int a, int b) : x(a), y(b) {}}; struct ListNode {    int val;    ListNode *next;    ListNode(int x) : val(x), next(NULL) {}}; class Solution {public:void emerge(ListNode *&s,ListNode *&t) {ListNode *p = s, *q = t,*cur= s,*head;//cout<<"emerge "<<p->val<<" "<<q->val<<endl;if(p&&q){//cout<<"hello"<<endl;if(p->val<=q->val) {head = p;cur = p;p = p->next;}else {head = q;cur = q;q = q->next;}while(p&&q){if(p->val<=q->val){cur->next = p;cur = p;p = p->next;}else{cur->next = q;cur = q;q = q->next;}}if(p)cur->next = p;if(q)cur->next = q;}else{if(p) head = p;if(q) head = q;}//p = head;//while(p){cout<<"-----"<<p->val<<" ";p=p->next;}//cout<<"-----"<<endl;s = head;}    ListNode *sortList(ListNode *&head) {//cout<<"sort "<<head<<endl;if(head){ListNode *p=head,*q=head;if(!head->next)return head;else{//ListNode *s = p;//while(s){cout<<"s->val="<<s->val<<endl;s = s->next;}while(q->next){p = p->next;q = q->next->next;if(!q)break;}}ListNode *s;q = head;while(q!=p){s = q;q = q->next;}s->next = NULL;//cout<<"head "<<head->val<<endl;//cout<<"p "<<p->val<<endl;//system("pause");sortList(head);sortList(p);emerge(head,p);return head;}return head;}};int main(){Solution S;ListNode * head = NULL, *s;int x;int count = 0;while(cin>>x){count++;ListNode *p = new ListNode(x);if(count == 1) {head = p;s = head;}else{s->next = p;s = s->next;}//delete p;}ListNode *p;p = head;while(p){cout<<p->val<<" ";p=p->next;}cout<<endl;ListNode * ret = S.sortList(head);p = head;while(p){cout<<p->val<<" ";p=p->next;}return 0;}

欢迎指正bug.

0 0
原创粉丝点击