线性结构 两个有序链表序列的合并 + 个人反思

本文分享了一次链表合并的编程经历,作者通过解决实际问题,总结了指针理解和链表操作中容易忽视的细节,包括新节点的正确创建与链接、指针的移动等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大佬分析与代码

这道题又折磨了我将近2个小时,我真菜
刚开始以为链表的创建与题意不符,debug了半天后发现没问题
后来出现的问题是
1.我想写成p3->next->data=p2->data结果没开辟新结点,p3->next根本找不到存储地址,导致报错
2.写完

List p=(PtrToNode)malloc(sizeof(PtrToNode));
			p->data=p1->data;//递增序
			p1=p1->next; 
			p3=p;

容易发现我p3没有后移,这就导致p3一直都是指向NULL最后L3也是NULL

入门级别的题,指针理解不好,细节处理不好真的要命啊!!!

#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
    ElementType data;
    PtrToNode   next;
};
typedef PtrToNode List;

List Read()
{
	List L=(PtrToNode)malloc(sizeof(PtrToNode));
	L->next=NULL;//建立一个带头结点的新链表
	if(!L) exit(-1); 
	PtrToNode p=L,t;//一个尾指针,一个指向新节点的指针 
	int n,e;
    scanf("%d",&n);
	while(n>0)
	{
		scanf("%d",&e);
		t=(PtrToNode)malloc(sizeof(PtrToNode));//开辟新空间用来存放新数据 
		t->data=e;
		t->next=NULL;
		p->next=t;
		p=t;
		n--;
	}  
	p->next=NULL;
	return L;
} 
void Print( List L )
{
	PtrToNode p=L->next;
	if(!p){
	    printf("NULL\n");
	    return;
	}
	while(p!=NULL)
	{
       if(p->next!=NULL)
           printf("%d ",p->data);
       else
           printf("%d",p->data);
   	   p=p->next;
	}
	printf("\n");
} 
List Merge( List L1, List L2 );

int main()
{
    List L1, L2, L;
    L1 = Read();//Print(L1);
    L2 = Read();//Print(L2);
    L = Merge(L1, L2);
    Print(L);
    Print(L1);
    Print(L2);
    return 0;
}

/* 你的代码将被嵌在这里 */
List Merge( List L1, List L2 )
{
	PtrToNode p1,p2,p3;//创建三个指针分别指向三个链表 
	p1=L1->next;
	p2=L2->next;
	List L3=(PtrToNode)malloc(sizeof(PtrToNode));
	L3->next=NULL;
	p3=L3;
	
	while(p1&&p2)
	{
		if(p1->data>=p2->data)
		{
//			List p=(PtrToNode)malloc(sizeof(PtrToNode));//写法一,每次都给L3开辟新结点 
//			p->data=p2->data;//递增序
//			p3->next=p;
//			p2=p2->next; 
//			p3=p;//p3后移 
            p3->next=p2;
            p3=p3->next;//或写成p3=p2,都相当于p3后移 
            p2=p2->next;
		}
		else
		{
//			List p=(PtrToNode)malloc(sizeof(PtrToNode));
//			p->data=p1->data;//递增序
//			p3->next=p;
//			p1=p1->next; 
//			p3=p;
			p3->next=p1;
			p3=p3->next;
			p1=p1->next; 
		}
	}
	if(p1)
	{
		p3->next=p1;
	}
	if(p2)
	{
		p3->next=p2;
	}
	L1->next=NULL;//根据题目,合并完成后需将L1,L2赋空 
	L2->next=NULL;
	return L3;
}
/*3
1 3 5
5
2 4 6 8 10*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值