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

【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 在获取boss直聘的聊天的时候只能获取到前40条聊天数据
  • ¥20 关于URL获取的参数,无法执行二选一查询
  • ¥15 液位控制,当液位超过高限时常开触点59闭合,直到液位低于低限时,断开
  • ¥15 marlin编译错误,如何解决?
  • ¥15 有偿四位数,节约算法和扫描算法
  • ¥15 VUE项目怎么运行,系统打不开
  • ¥50 pointpillars等目标检测算法怎么融合注意力机制
  • ¥20 Vs code Mac系统 PHP Debug调试环境配置
  • ¥60 大一项目课,微信小程序
  • ¥15 求视频摘要youtube和ovp数据集