LeetCode problem 4:Sort List

思路:这道题目主要考链表的操作,由于很久没有写链表了,这道题目花费的时间不少,主要是一些边界条件的考虑、指针的操作等等。指针的操作是个非常重要的基本功,我就是指针操作悲剧了许久 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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值