java8 stream.of 两个list合并_两个有序链表的合并

这篇博客介绍了如何合并两个已排序的链表,通过创建一个新的链表并使用双指针技术,比较两个链表的节点值,将较小的节点添加到新链表中。同时,提供了两种实现方式,包括原始的合并方法和优化后的合并方法,优化后的代码更简洁高效。此外,还包含了链表初始化和打印链表的辅助函数。
摘要由CSDN通过智能技术生成
7f877469abf8502260e35b1fec33d801.png

两个有序链表的合并

要求

  • 给定两个有序链表,将两个链表合并为一个有序链表

思路

  • 对于给定的链表l1和链表l2。定义一个链表l3来存储合并后的两个链表。
  • 定义两个指针,分别指向两个链表的头结点,在两个链表都不为空时,比较两个链表结点的值的大小。若链表l1的节点大于l2的节点,则将l1的节点值赋值给l3。l1的指针指向下一个节点。反之,则则将l2的节点值赋值给l3。l2的指针指向下一个节点。
  • 两个链表出现一个为空时,判断哪个不为空,将该链表剩下的节点全部赋值给l3。

图解

42bc653a1efea862b18b159877134aaa.png

两个有序链表的合并


代码

#include #include //构造结构体typedef struct list{int data;struct list *next;}*List,LNode;//函数声明List init_list(List head,int num);void print_list(List head);List merge(List l1,List l2);void main(){    List l,l1,l2;    l1 = (LNode*)malloc(sizeof(LNode));    l1 = init_list(l1,3);    l2 = (LNode*)malloc(sizeof(LNode));    l2 = init_list(l2,7);    l = merge(l1,l2);    print_list(l);}//两个有序链表合并函数/*List merge(List l1,List l2){    List head,p,s;    head = (List)malloc(sizeof(LNode));    p = head;    while(l1 != NULL && l2 != NULL)    {        s = (List)malloc(sizeof(LNode));        if(l1->data > l2->data)        {            s ->data = l2->data;            l2 = l2->next;        }else{            s ->data = l1->data;            l1 = l1->next;        }        s->next = NULL;        p->next = s;        p = p->next;    }    while(l1 != NULL)    {        s = (List)malloc(sizeof(LNode));        s->data = l1->data;        l1 = l1->next;        s->next = NULL;        p->next = s;        p = p->next;    }    while(l2 != NULL)    {        s = (List)malloc(sizeof(LNode));        s->data = l2->data;        l2 = l2->next;        s->next = NULL;        p->next = s;        p = p->next;    }    return head->next;}*///两个有序链表合并函数优化List merge(List l1,List l2){    List head,p,s;    head = (List)malloc(sizeof(LNode));    p = head;    while(l1 != NULL || l2 != NULL)    {        s = (List)malloc(sizeof(LNode));        if(l1 != NULL && l1->data <= l2->data)        {            s ->data = l1->data;            l1 = l1->next;        }else{            s ->data = l2->data;            l2 = l2->next;        }        s->next = NULL;        p->next = s;        p = p->next;    }    return head->next;}//链表初始化函数List init_list(List head,int num){int i = 1;List p = head;while(i <= num){List s;s = (LNode*)malloc(sizeof(LNode));s->data = i * num;s->next = NULL;p->next = s;p = p->next;i++;}return head->next;}//链表输出函数void print_list(List head){List p;p = head;while(p != NULL){printf("%d ",p->data);p = p->next;}printf("");}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值