C语言怎么合并两个有序链表

C语言合并两个有序链表的方法:拼接指定的两个有序链表的所有节点即可。例如两个有序链表分别为【1->2->4】和【1->3->4】,合并后的有序链表为【1->1->2->3->4->4】。

具体方法:

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

输入:

1->2->4, 1->3->4

输出:

1->1->2->3->4->4

分析:两个链表为有序链表,所以依次遍历两个链表比较大小即可。

代码实现:

/**

 * Definition for singly-linked list.

 * struct ListNode {

 *     int val;

 *     struct ListNode *next;

 * };

 */

struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){

    if(l1==NULL){

        return l2;

    }

    if(l2==NULL){

        return l1;

    }

    struct ListNode *l = (struct ListNode*)malloc(sizeof(struct ListNode));

    l->next = NULL;

    struct ListNode *list1 = l1;

    struct ListNode *list2 = l2;

    if(l1->valval){

        l->val=l1->val;

        if(list1->next==NULL){

            l->next=list2;

            return l;

        }

        list1=list1->next;

    }else{

        l->val=l2->val;

        if(list2->next==NULL){

            l->next=list1;

            return l;

        }

        list2=list2->next;

    }

    struct ListNode *list = l;

    while(list1->next!=NULL&&list2->next!=NULL){

        if(list1->val<=list2->val){

            struct ListNode *body = (struct ListNode *)malloc(sizeof(struct ListNode));

            body->val = list1->val;

            body->next = NULL;

            list->next = body;

            list = list->next;

            list1 = list1->next;

        }else{

            struct ListNode *body = (struct ListNode*)malloc(sizeof(struct ListNode));

            body->val=list2->val;

            body->next=NULL;

            list->next=body;

            list=list->next;

            list2=list2->next;

        }

    }

    if(list1->next==NULL){

        while(list2->next!=NULL){

            if(list1->val<=list2->val){

                list->next = list1;

                list = list->next;

                list->next=list2;

                return l;

            }else{

                struct ListNode *body = (struct ListNode*)malloc(sizeof(struct ListNode));

                body->val=list2->val;

                body->next=NULL;

                list->next=body;

                list=list->next;

                list2=list2->next;

            }

        }

    }else{

        while(list1->next!=NULL){

            if(list2->val<=list1->val){

                list->next=list2;

                list=list->next;

                list->next=list1;

                return l;

            }else{

                struct ListNode *body = (struct ListNode*)malloc(sizeof(struct ListNode));

                body->val=list1->val;

                body->next=NULL;

                list->next=body;

                list=list->next;

                list1=list1->next;

            }

        }

    }

    if(list1->next==NULL&&list2->next==NULL){

        if(list1->val<=list2->val){

            list->next = list1;

            list=list->next;

            list->next=list2;

        }else{

            list->next=list2;

            list=list->next;

            list->next=list1;

        }

    }

    return l;

}

声明:

本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。


  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值