1. 程式人生 > >PAT-ADVANCED1052——Linked List Sorting

PAT-ADVANCED1052——Linked List Sorting

我的PAT-ADVANCED程式碼倉:https://github.com/617076674/PAT-ADVANCED

原題連結:https://pintia.cn/problem-sets/994805342720868352/problems/994805425780670464

題目描述:

題目翻譯:

1052 連結串列排序

連結串列由一系列結構組成,這些結構在儲存器中不一定相鄰。 我們假設每個結構包含一個整數鍵值和一個指向下一個結構的Next指標。 現在給出一個連結串列,你需要按照鍵值的遞增順序對結構進行排序。

輸入格式:

每個輸入檔案包含一個測試用例。 對於每個測試用例,第一行包含一個正整數N(< 10 ^ 5)和頭節點的地址,其中N是儲存器中節點的總數,節點的地址是5位正整數。 NULL由-1表示。

然後是N行,每行按以下格式描述一個節點:

Address Key Next

其中Address是記憶體中節點的地址,Key是[-10 ^ 5, 10 ^ 5]範圍內的整數,Next是下一個節點的地址。題目保證所有節點的鍵值都是不同的,並且從頭節點開始在連結串列中沒有迴圈。

輸出格式:

對每個測試用例,輸出格式與輸入格式相同,其中N是列表中節點的總數,所有節點必須按順序排序。

輸入樣例:

5 00001
11111 100 -1
00001 0 22222
33333 100000 11111
12345 -1 33333
22222 1000 12345

輸出樣例:

5 12345
12345 -1 00001
00001 0 11111
11111 100 22222
22222 1000 33333
33333 100000 -1

知識點:連結串列

思路:首先根據首節點篩選出連結串列中的所有節點,再對篩選出的節點進行排序

根據題給的頭節確定的連結串列中可能沒有任何節點,測試點4就是這樣一種情況。因此我們需要對一個flag陣列來標記哪些位置的節點是存在的,哪些位置的節點是不存在的。對於頭節點,如果其節點不存在,我們直接輸出“0 -1”。

時間複雜度最差情況下是O(NlogN)。空間複雜度是O(100000)。

C++程式碼:

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

struct node {
	int address;
	int key;
	int next;
	node() {};
	node(int _address, int _key, int _next) : address(_address), key(_key), next(_next) {};
};

node Node[100000];
bool flag[100000];

bool cmp(node node1, node node2);

int main() {
	int N, first, now, key, next, cur;
	fill(flag, flag + 100000, false);
	scanf("%d %d", &N, &first);
	for(int i = 0; i < N; i++) {
		scanf("%d %d %d", &now, &key, &next);
		Node[now] = node(now, key, next);
		flag[now] = true;
	}
	vector<node> nodes;
	if(!flag[first]){
		printf("0 -1\n");
		return 0;
	}
	cur = first;
	while(cur != -1) {
		nodes.push_back(Node[cur]);
		cur = Node[cur].next;
	}
	sort(nodes.begin(), nodes.end(), cmp);
	printf("%d %05d\n", nodes.size(), nodes[0].address);
	for(int i = 0; i < nodes.size(); i++) {
		if(i != nodes.size() - 1) {
			printf("%05d %d %05d\n", nodes[i].address, nodes[i].key, nodes[i + 1].address);
		} else {
			printf("%05d %d -1\n", nodes[i].address, nodes[i].key);
		}
	}
	return 0;
}

bool cmp(node node1, node node2) {
	return node1.key < node2.key;
}

C++解題報告: