题解 | #合并表记录#

合并表记录

https://www.nowcoder.com/practice/de044e89123f4a7482bd2b214a685201

解题思路:使用带头结点的静态链表,头结点的index字段存储尾结点位置,链表元素按照index从小到大排序,如果index大小相同则合并同类项,否则找到合适的位置,将结点插入到该位置。所有结点输入完毕后,遍历链表输出index和value即可。
#include <stdio.h>

typedef struct ListNode {
    int index;
    int value;
    int next;
} ListNode;

// 静态链表
void initList(ListNode *list) {
    list[0].index = 0;
    list[0].value = 0;
    list[0].next = -1;
}

void newNode(ListNode *list, int index, int value) {
    int i = ++list[0].index; // 头结点的index字段存储链表尾指针
    list[i].index = index;
    list[i].value = value;
    list[i].next = -1;
}

int insertNode(ListNode *list, int index, int value) {
    int i = list[0].next, prev = 0;
    while (i != -1) {
        // 合并相同index
        if (list[i].index == index) {
            list[i].value += value;
            return 0;
        }
        // 索引按顺序排列
        if (list[i].index > index) {
            break;
        }
        prev = i;
        i = list[i].next;
    }
    // 在合适位置插入节点
    newNode(list, index, value);
    int idx = list[0].index;
    list[idx].next = i;
    list[prev].next = idx;
    return 0;
}

int main() {
    ListNode list[501];
    initList(list);
    int num, i;
    int idx, value;
    scanf("%d", &num);
    for (i = 0; i < num; ++i) {
        scanf("%d %d", &idx, &value);
        insertNode(list, idx, value);
    }
    for (i = list[0].next; i != -1; i = list[i].next) {
        printf("%d %d\n", list[i].index, list[i].value);
    }
    return 0;
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务