首页 > 其他分享 >题02-线性结构1 两个有序链表序列的合并(代码和笔记)

题02-线性结构1 两个有序链表序列的合并(代码和笔记)

时间:2022-09-01 21:55:47浏览次数:97  
标签:02 结点 temp 笔记 链表 temp2 temp1 free L1

@

目录

题目

本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。

函数接口定义:

List Merge( List L1, List L2 );

其中List结构定义如下:

typedef struct Node PtrToNode;
struct Node {
ElementType Data; /
存储结点数据 /
PtrToNode Next; /
指向下一个结点的指针 /
};
typedef PtrToNode List; /
定义单链表类型 */

L1和L2是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Merge要将L1和L2合并为一个非递减的整数序列。应直接使用原序列中的结点,返回归并后的带头结点的链表头指针。

裁判测试程序样例:

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

typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
    ElementType Data;
    PtrToNode   Next;
};
typedef PtrToNode List;

List Read(); /* 细节在此不表 */
void Print( List L ); /* 细节在此不表;空链表将输出NULL */

List Merge( List L1, List L2 );

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

/* 你的代码将被嵌在这里 */

输入样例:

3
1 3 5
5
2 4 6 8 10

输出样例:

1 2 3 4 5 6 8 10
NULL
NULL

思路

L1链:L1指针指向头结点,temp1指针用来依次指向头结点后的带数据的结点。
L2链:L2指针指向头结点,temp2指针用来依次指向头结点后的带数据的结点。
L链:用来连接生成新的合并链,temp指针先指向头结点,每合并一个结点就往后指向最后有个结点。
在这里插入图片描述
通过指针对节点进行操作:
①指针temp1和temp2各自指向的结点进行对比。
②将对比后小的那个结点的后一个结点作为它所在链的第一个带数据的结点,也就是将该链的头结点指向小结点的后一个结点(如L1的数字1和L2的数字2结点比较,1<2,则将1所在链L1的头结点指向1后面的结点3,让3成为该链除头结点开头的结点,L1链也就变成:头 → 3 → 5)。
③对比完通过指针temp操作L链连接比较小的那个结点(L链:头 → 1
④指针temp、temp1和temp2,需变动的指针为L链的和小的结点所在的链的指针,往后指向下一个结点。(L1链:temp1指向3、L2链:temp2所指结点不是最小,指向仍然不变,仍旧指向2、L链:temp指向新增结点1)。

最后,当有个链遍历完,则该链只剩下头结点,则该链上游动的指针会指向头结点所指的地址为NULL。退出比较,再查看是否还有不为空的另外的链,有不为空的链就把它剩下的部分接到L链后。

补充的代码

List Merge(List L1,List L2)
{
    //取L1的第一个整数,通过L1指针指向的头结点的Next来取数List L1->Next
    //创建L的头结点
    List L = (List)malloc(sizeof(struct Node));
    //创建temp1、temp2和temp为临时指针来遍历结点
    List temp,temp1,temp2;
    //temp指向L的头结点
    temp = L;
    //temp1和temp2指向L1和L2的第一个结点(非头结点)
    temp1 = L1->Next;
    temp2 = L2->Next;
    //L1和L2链都不为空(除头结点)
    while(temp1!=NULL&&temp2!=NULL)
    {
        if(temp1->Data<temp2->Data){
            L1->Next = temp1->Next;//L1头结点指向该最小值的后一个结点
            temp->Next = temp1;//L链加入该最小值结点
            temp = temp1;
            temp1 = L1->Next;
        }else{
            L2->Next = temp2->Next;
            temp->Next = temp2;
            temp = temp2;
            temp2 = L2->Next;
        }
    }
    if(temp1==NULL&&temp2!=NULL){
        temp->Next = temp2;
        L2->Next = NULL;
    }else if(temp2==NULL&&temp1!=NULL){
        temp->Next = temp1;
        L1->Next = NULL;
    }
//     free(temp1);//这三个free的代码都不能加,加了就出错。
//     free(temp2);
//     free(temp);
    return L;
}

注意不要在后面free掉指针,会出现这些错误:
①free(temp1);

free(temp1);
//     free(temp2);
//     free(temp);

在这里插入图片描述
②free(temp2);

//      free(temp1);
     free(temp2);
//     free(temp);

在这里插入图片描述

在这里插入图片描述
③free(temp);

//      free(temp1);
//      free(temp2);
     free(temp);

在这里插入图片描述
在这里插入图片描述
④全部free

     free(temp1);
     free(temp2);
     free(temp);

在这里插入图片描述
在这里插入图片描述

标签:02,结点,temp,笔记,链表,temp2,temp1,free,L1
From: https://www.cnblogs.com/denglongjiao/p/16647944.html

相关文章

  • The 2022 Hangzhou Normal U Summer Trials
    A.Hello,ACMer!这题就是找到hznu的个数#include<bits/stdc++.h>usingnamespacestd;int32_tmain(){strings;cin>>s;intcnt=0;for(i......
  • 数据库学习笔记 (本数据库学习笔记以SQL sever 2019 为例进行学习) 20220831 第四节课
    两层映像两层映像E-CMapping:ExternalSchema-ConceptualSchemaMapping----将外模式映射为概念模式,从而支持实现数据概念视图向外部视图的转换----便于用户观察和......
  • 小迪安全D3笔记:基础入门-搭建安全拓展
    title:小迪安全D3笔记:基础入门-搭建安全拓展author:TTdate:2022-09-01域名扫描只能扫描出来域名文件,而域名文件只是占服务器资源的一小部分;IP扫描可以直接扫描出来......
  • 24 两两交换链表中的节点
    题目24两两交换链表中的节点给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:输......
  • leetcode 206. Reverse Linked List 反转链表(简单)
    一、题目大意给你单链表的头节点head,请你反转链表,并返回反转后的链表。示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出:[2,1]示例3:......
  • 2022 8 29
    https://www.lanqiao.cn/problems/1463/learning/主要是运行时间问题:importosimportsysn=2021041820210418l=[]i=2x=nwhilei<pow(x+1,0.5):ifx%i==0......
  • 链表的头插法和尾插法
    复习一下链表的插入操作头插法创建一个临时节点存放数据将头部指针后面的数据都链接到这个临时节点后面将这个临时节点再链接到头部指针后面尾插法创建......
  • 2022-09-01 第二小组 张晟源(ajax,axios)
    JavaWeb一,AJAX异步刷新(局部刷新),前端技术,可以给后台发请求异步:整个页面不会全部刷新,只有某个局部刷新  验证用户名存在 使用ajax发送请求,页面不可以通过后台跳转......
  • 2021 上海
    #include<bits/stdc++.h>#defineTLEios::sync_with_stdio(0),cin.tie(0)#defineendl"\n"#defineFILE"a"#definepbpush_back#defineggexit(0);#definert......
  • 随堂笔记
    常用的快捷键:*Ctrl+S:快速保存*Alt+/:快速提示*Ctrl+Z:回退到上一步*Ctrl+Y:前进到下一步*Ctrl+Shift+/:快速注释*Ctrl+D:快速删除一行*Ctrl+S......