PAT-ADVANCED1052——Linked List Sorting
阿新 • • 發佈:2018-11-10
我的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++解題報告: