Bella_Notte 2023-03-24 17:00 采纳率: 88.9%
浏览 29

【C语言】合并链表问题

问题描述:
题目:两个非降序链表的并集,例如将链表1->2->3 和 2->3->5 并为 1->2->3->5,只能输出结果,不能修改两个链表的数据。
【输入形式】
第一行为第一个链表的各结点值,以空格分隔。
第二行为第二个链表的各结点值,以空格分隔。
【输出形式】
合并好的链表,以非降序排列,值与值之间以空格分隔。
【样例输入】
4 7 10 34
1 4 6 29 34 34 52
【样例输出】
1 4 6 7 10 29 34 52

我的代码实现如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SLTDataType;

typedef struct ListNode {
    int val;
    struct ListNode* next;
}LTNode;

LTNode* BuySLTNode(SLTDataType x)
{
    LTNode* newnode = (LTNode*)malloc(sizeof(LTNode));
    if (newnode == NULL)
    {
        perror("malloc fail");
        exit(-1);
    }
    newnode->val = x;
    newnode->next = NULL;
    return newnode;
}

LTNode* CreateSList()
{
    SLTDataType data;
    LTNode* phead = NULL, * ptail = NULL;
    while (scanf("%d",&data)!=EOF)
    {
        LTNode* newnode = BuySLTNode(data);
        if (phead == NULL)
        {
            ptail = phead = newnode;
        }
        else
        {
            ptail->next = newnode;
            ptail = newnode;
        }
        if (getchar() == '\n')
        {
            break;
        }
    }
    return phead;
}

void LTPrint(LTNode* phead)
{
    LTNode* cur = phead;
    while (cur)
    {
        printf("%d ", cur->val);
        cur = cur->next;
    }
}

LTNode* MergeTwoLists(LTNode* list1, LTNode* list2)
{
    LTNode* guard, *tail;
    guard = tail = (LTNode*)malloc(sizeof(LTNode));
    while (list1&&list2)
    {
        if (list1->val < list2->val)
        {
            tail->next = list1;
            tail = tail->next;
            list1 = list1->next;
        }
        else if (list1->val > list2->val)
        {
            tail->next = list2;
            tail = tail->next;
            list2 = list2->next;
        }
        else
        {
            if (tail->val != list2->val)
            {
                tail->next = list2;
                tail = tail->next;
            }
            list2 = list2->next;
            list1 = list1->next;
        }
    }
    while(list1)
    {
        if (tail->val != list1->val)
        {
            tail->next = list1;
            list1 = list1->next;
            tail = tail->next;
            continue;
        }
        list1 = list1->next;
    }
    while(list2)
    {
        if (tail->val != list2->val)
        {
            tail->next = list2;
            list2 = list2->next;
            tail = tail->next;
            continue;
        }
        list2 = list2->next;
    }
        
    LTNode* newhead = guard->next;
    free(guard);
    return newhead;
}

int main()
{
    LTNode* plist1 = CreateSList();
    LTNode* plist2 = CreateSList();
    LTNode* plist3 = MergeTwoLists(plist1, plist2);
    LTPrint(plist3);
    return 0;
}

  • 我的思路:同时遍历两个链表,值更小的插入到新链表

  • 我的疑惑:不知道该如何处理值的重复出现
    如:

    img

希望得到解答 ,非常感谢!

  • 写回答

3条回答 默认 最新

  • 於黾 2023-03-24 17:05
    关注

    不要只判断链表A和B谁大,顺便判断一下和C相等不相等,相等就过
    其实就是执行插入之前先判断一下不相等再插入,相等就什么都不做,继续循环

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月24日

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀