有序链表的合并

/*

Name: 有序链表的合并

Copyright:

Author: 巧若拙

Date: 22-11-14 16:13

Description:

分别用递归和非递归两种方式实现两个有序链表(不含头结点)的合并

*/

#include<stdio.h>

#include<stdlib.h>

#include<malloc.h>

typedef char ElemType;

typedef int Status; //函数类型,其值是函数结果状态代码,如OK等

typedef struct Node{

ElemType data;//数据域

struct Node *next;//指针域

} Node, *LinkList;

void CreatList(LinkList *head);//创建一个不带头结点的单链表

void DisplayList(LinkList head);//输出单链表的所有结点

void SortList(LinkList *head);//选择排序法

LinkList Merge_1(LinkList hA, LinkList hB);//合并有序链表(非递归)

LinkList Merge_2(LinkList hA, LinkList hB);//合并有序链表(递归)

int main(void)

{

LinkList a = NULL;

LinkList b = NULL;

LinkList c = NULL;

CreatList(&a);//创建一个不带头结点的单链表

DisplayList(a);//输出单链表的所有结点

SortList(&a);//选择排序法

DisplayList(a);//输出单链表的所有结点

CreatList(&b);//创建一个不带头结点的单链表

DisplayList(b);//输出单链表的所有结点

SortList(&b);//选择排序法

DisplayList(b);//输出单链表的所有结点

c = Merge_2(a, b);//合并有序链表

DisplayList(c);//输出单链表的所有结点

return 0;

}

void CreatList(LinkList *head)//创建一个不带头结点的单链表

{

int i;

Node *p, *s;

//创建第一个结点

*head = (LinkList)malloc(sizeof(Node));

if (!*head)

{

printf("Out of space!");

exit(0);

}

p = *head;

p->data = rand()%26 + ‘A‘;

p->next = NULL;

for (i=1; i<5; i++)//创建其余的结点

{

s = (LinkList)malloc(sizeof(Node));

if (!s)

{

printf("Out of space!");

exit(0);

}

s->data = rand()%26 + ‘A‘;

s->next = NULL;

p->next = s;

p = p->next;

}

}

void DisplayList(LinkList head)//输出单链表的所有结点

{

while (head)

{

printf("%c ", head->data);

head = head->next;

}

printf("\n");

}

void SortList(LinkList *head)//选择排序法

{

ElemType temp;

Node *p, *pre, *min;

for (min=pre=*head; pre->next; min=pre=pre->next)

{

for (p=pre->next; p; p=p->next)

{

if (p->data < min->data)

min = p;

}

if (min != pre)//交换数据域

{

temp = min->data;

min->data = pre->data;

pre->data = temp;

}

}

}

LinkList Merge_1(LinkList hA, LinkList hB)//合并有序链表(非递归)

{

Node *p, *head;

head = (LinkList)malloc(sizeof(Node)); //先设置一个头结点

if (!head)

{

printf("Out of space!");

exit(0);

}

p = head;

while (hA && hB)

{

if (hA->data < hB->data)

{

p->next = hA;

p = hA;

hA = hA->next;

}

else

{

p->next = hB;

p = hB;

hB = hB->next;

}

}

p->next = hA ? hA : hB;

p = head->next; //删除头结点

free(head);

return p;

}

LinkList Merge_2(LinkList hA, LinkList hB)//合并有序链表(递归)

{

if (!hA)

return hB;

else if (!hB)

return hA;

if (hA->data < hB->data)

{

hA->next = Merge_2(hA->next, hB);

return hA;

}

else

{

hB->next = Merge_2(hB->next, hA);

return hB;

}

}

时间: 2025-01-07 11:23:29

有序链表的合并的相关文章

数据结构学习---有序链表的合并

递归调用 简单 有点像归并排序的合并部分吧. 因为是用vs创建的工程,所以主函数是_tmain. 1 // 链表.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 6 7 typedef struct Node { 8 int data; 9 struct Node *next; 10 11 } LinkList; 12 13 14 //链表组合的函数 输入:两个有序无头结点链表 输出:将链表组合成一个无头结点有序链表 15 Lin

多个有序链表的合并

1, 先将问题简化,合并两个有序链表 首先分析合并两个链表的过程.我们的分析从合并两个链表的头结点开始.链表1的头结点的值小于链表2的头结点的值,因此链表1的头结点将是合并后链表的头结点.如下图所示. 参考:http://www.cnblogs.com/jason2013/articles/4341153.html 使用递归方法,一步步生成头结点,代码如下 递归的要诀是子问题要和父问题完全一样,只是规模变小(每次调用,更小的参数值), 1 List merge(List head1, List

递归实现两个有序链表的合并

package com.wyl.linklist; /** * 合并两个链表 * @author wyl */ public class MergeLinkList { /** * 内部类,链表节点的结构 * @author wyl * */ public static class Node{ private int val; //节点值 private Node next; //节点的后继节点 public Node(){ } public Node(int val){ this(val,nu

两个有序链表的合并

笔记和代码的思路来源: 好大学慕课浙江大学陈越.何钦铭的<数据结构> 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef int ElementType; 5 typedef struct Node *PtrToNode; 6 struct Node { 7 ElementType Data; 8 PtrToNode Next; 9 }; 10 typedef PtrToNode List; 11 12 List

合并N个有序链表与FQ公平调度

下大雨了,于是就想表达一些只有下雨才能表达的东西.夜半酒酣惊觉起,使我流泪忆江南-前天晚上下班带着小小在暴雨中狂奔,非常舒服,其实也算是流言终结者吧.反驳一下几千年来在我国北方通过长辈代代相传的淋雨和感冒之间的因果关系. ??昨天早上很早起来,听雨作文,今天早上继续,文章不算太长. 合并两个有序链表 这是一道超级常见的课后作业题或者面试题,网上答案一搜一箩筐,我自己也写了一个不会编程版: 有序链表合并C语言递归版–我稍微会一点编程:https://blog.csdn.net/dog250/art

详谈单链表之合并and冒泡排序

<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong> 线性表一章基本看完了,但是感觉还学得太少,应该和一些经典的算法相结合,看看自己应用的如何.不得不承认自己只是做简单的实现,并没有对代码进行太多的优化...希望各位大神莫怪~~废话少说,代码搞起..</strong></span> <strong><span style="font-fa

K个排序链表的合并(Hard)

问题来源:选自leetCode 23:合并K个排序链表 问题描述: 题目给定信息: 不确定需要合并的链表的数目,但依然要求我们把给定的这些有序链表合并成一个链表,并且保证合并的链表依然是有序的. 问题分析: 我们可以使用暴力合并的方法,就是不管有多少个链表,先让第一个链表和第二个链表进行合并,合并之后的结果在和第三个链表进行合并,依次进行下去直到把全部的链表全部合并成一个链表,这种方法是最简单最易想到的方法,但是时间复杂度太高了:还有一种方法是把所有链表中的节点值保存到一个数组中,然后对这个数组

链表(14)----合并两个有序链表

1.链表定义 typedef struct ListElement_t_ { void *data; struct ListElement_t_ *next; } ListElement_t; typedef struct List_t_{ int size; int capacity; ListElement_t *head; ListElement_t *tail; } List_t; 2.合并两个有序链表 ListElement_t * MergeList( ListElement_t *

23. Merge k Sorted Lists 合并K个有序链表

这道题是21题合并2个有序链表的升级版本,看了许多解题思路: A:直接暴力解锁,全部放进一个堆,然后依次吐出来: B:利用21题的算法,循环一次做两两合并,这样就得到结果:但是时间复杂度有点差: C:利用归并排序思想,进行分治:其实就是利用递归,牺牲空间,提升时间效率: 存在的问题是:看过了许多解答后发现,大家基于的给定数据类型是 List<ListNode>/ArrayList<ListNode>,然后,现在系统更新了,给的数据类型是 ListNode[] lists,所以,我现