ACM练习 链表排序 II 【WA】

注意:在OJ上提交时不要使用endl,可能会出问题。用\n代替。

描述

已知

  1. 小 g 手里有一个链表。

  2. 小 g 希望手里的链表是按照单调非减的顺序排好的。

  3. 小 g 希望链表中值相同的节点在排完序后相对次序也不会改变。

  4. 小 g 很笨。

聪明的你快来帮帮小 g,实现他的愿望。

输入
第一行为两个整数,分别为小 g 的链表中节点的个数 N (0 ≤ N ≤ 100000),和第一个节点的编号 H (1 ≤ H ≤ N)。
接下来的 N 行中,第 i (1 ≤ i ≤ N) 行包含两个整数,分别为编号为 i 的节点的值 Ai (-10^9 ≤ Ai ≤ 10^9) 和它的下一个节点的编号 Bi (0 ≤ Bi ≤ N)。

约定链表中最后一个节点的下一个节点的编号用 0 表示,且空链表第一个节点编号用 0 表示。

输出
第一行为一个整数,为排序后的链表中第一个节点的编号。
接下来的 N 行中,第 i (1 ≤ i ≤ N) 行包含一个整数,为排序后的链表中编号 i 的节点的下一个节点的编号 Bi’ (0 ≤ Bi’ ≤ N)。

样例输入
3 2
2 3
3 1
1 0

扫描二维码关注公众号,回复: 5977878 查看本文章

样例输出
3
2
0
1
我的测试用例

20 1
20 2
19 3
18 4
17 5
16 6
15 7
14 8
13 9
12 10
11 11
11 12
11 13
11 14
11 15
11 16
11 17
11 18
11 19
11 20
11 0

输出结果(是对的吧)

10
0
1
2
3
4
5
6
7
8
11
12
13
14
15
16
17
18
19
20
9

代码

只通过了自己的测试用例,没通过OJ

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Node
{
public:
	int num;
	int value;
	int next;
};

int mysort(Node a1, Node a2)
{
	return(a1.value < a2.value);
}

int main()
{
	int total, first;
	cin >> total >> first;
	//空链表检测
	if (total == 0)
	{
		cout << '0';
		return 0;
	}

	//原链表
	vector<Node> linklist;
	Node tNode;
	int i;
	for (i = 0; i < total; i++)
	{
		tNode.num = i + 1;
		cin >> tNode.value >> tNode.next;
		tNode.next = 0;//此数据无用置零

		linklist.push_back(tNode);
	}

	//复制
	vector<Node> resultlist(linklist);

	//排序
	stable_sort(linklist.begin(), linklist.end(), mysort);

	//填写
	int j;
	for (i = 0; i < total; i++)
	{
		resultlist[linklist[i].num - 1].next = (i + 1 < total ? linklist[i + 1].num : 0);
	}

	//输出
	cout << linklist[0].num << endl;
	for (i = 0; i < total; i++)
	{
		cout << resultlist[i].next << '\n';
	}

	cout << endl;
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/sinat_42483341/article/details/89225867