用cpp编写一段代码,合并子链表 描述 一个链表由非负整数构成,链表开端和末尾是0,中间也可能有0,这些0值将链表分隔成一系列“子链表”。 现在,请你将每条“子链表”合并成一个节点,该节点的值为其对应的子链表的所有节点的值之和,同时去掉分隔标志0。 输入 输入一串非负整数(0、正整数)和-1,两个数之间用空格隔开,以-1作为结束标记;只有非负整数和-1,不会出现其他数,且-1一定出现在最后。 不存在连续0值,且第一个和倒数第二个数均为0值。 输出 输出合并后的链表,每个正整数后面有一个空格。 本题为程序填空题,代码如下。 #include <iostream> using namespace std; struct ListNode { int val; ListNode* next; }; ListNode* createList() { ListNode* head = NULL; ListNode* p1, * p2; p1 = new ListNode; p2 = p1; cin >> p1->val; while (p1->val != -1) { if (head == NULL) head = p1; else p2->next = p1; p2 = p1; p1 = new struct ListNode; cin >> p1->val; } p2->next = NULL; delete p1; return head; } ListNode* mergeNodes(ListNode* head) { //这个函数需要你补充完成 } int main() { ListNode* head; head = createList(); ListNode* ans = mergeNodes(head); while (ans != NULL) { cout << ans->val << " "; ans = ans->next; } return 0; }
时间: 2023-06-04 18:05:20 浏览: 315
这是一道程序填空题,代码如下:
```
#include <cstdio>
const int maxn = 100010;
int main() {
int n, num[maxn], f[maxn];
//读入链表
scanf("%d", &n);
int cnt = 0, sum = 0;//cnt记录子链表的个数,sum为当前子链表的和
while(n != -1) {
if(n == 0) {//遍历到链表的分隔符0
if(sum != 0) {//若当前子链表的和不为0,则将其记录到数组中
num[cnt] = sum;
cnt++;
}
sum = 0;//重置当前子链表的和
}
else {//遍历到链表中的数字
sum += n;
}
scanf("%d", &n);
}
for(int i = 0; i < cnt; i++) {//合并子链表
for(int j = 0; j < cnt - i - 1; j++) {
f[j] = num[j] + num[j+1];
}
for(int j = 0; j < cnt - i - 1; j++) {
num[j] = f[j];
}
}
printf("%d", num[0]);//输出合并后的链表的第一个节点
for(int i = 1; i < cnt-1; i++) {//输出合并后的链表的其余节点
printf(" %d", num[i]);
}
return 0;
}
```
该代码可以实现合并子链表的功能。具体思路如下:
首先读入整个链表(以-1结束),并从中记录所有的子链表的和,得到一个存储所有子链表和的数组num。接下来,我们需要将num数组中相邻的两个数相加,得到一个新的数组f,这样就合并了一个子链表。将f数组复制回num数组后,重复以上步骤直到只剩下一个数字为止,这个数字即为合并后的链表的第一个节点。
阅读全文