合并两个升序链表

题目:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 ------来自LeetCode热题100道
示例:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

输入:l1 = [], l2 = []
输出:[]

输入:l1 = [], l2 = [0]
输出:[0]
分析:
我一开始的想法就是选取list1或者list2作为基础,随后另一个链表对此链表进行排序插入,值得注意的是对头节点的插入,需要及时更新头结点,还有就是看到题目的时候最好把思路理清楚,以及可能发生的情况,不然这次我就是总是提交,发现检测点不通过的时候,再不停的改,这样很痛苦的。完后,看到官方的解答就是,建立空链表,然后list1和list2不断比较,小的值不断放入,这样的话,就是不需要写很多条件了,最后没有遍历完的链表,只需要继续插入即可。
代码:

struct ListNode* Creat()//建立节点
{
    struct ListNode* p;
    p = malloc(sizeof(struct ListNode));
    p->next = NULL;
    return p;
}

struct ListNode* Attach(struct ListNode* tempt,int ival)
{
    struct ListNode* ahead = tempt;//保存此时头结点
    struct ListNode* t = Creat();
    t->val = ival;
    //if(tempt == NULL) return NULL;
    while(tempt != NULL)
    {
        if(tempt->next != NULL)//此时至少有两个节点
        {
            if(ival>=tempt->val && ival <=tempt->next->val)//在中间插入的情况
            {
               t->next = tempt->next;
               tempt->next = t;
               break;
            }
            else if(ival<tempt->val)//插入头结点前面的情况
            {
                t->next = tempt;
                ahead  = t;//更新头结点
                break;
            }
        }
        else if(tempt->next == NULL)//只有一个节点或者是尾结点的情况
        {
            if(ival<=tempt->val)
            {
                t->next = tempt;
                ahead = t;
            } 
            else tempt->next = t;
            break;
        }
        tempt = tempt->next;
    }
    return ahead;
}

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
    struct ListNode* L = NULL;
    if(list1 != NULL)
     {
        L = list1;
        while(list2 != NULL)
        {
           L = Attach(L,list2->val); 
           list2 = list2->next;
        }
     }
     else if(list2 != NULL) return list2;
    return L;
}
//官方示例
typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) 
{
    ListNode* l1 = list1;
    ListNode* l2 = list2;
    if(list1 == NULL&&list2==NULL)
    {
        return list1;
    }
    if(list1 == NULL)
    {
        return list2;
    }
    if(list2 == NULL)
    {
        return list1;
    }
    //创建一个新链表
    ListNode* newhead = (ListNode*)malloc(sizeof(ListNode));

    ListNode* newcur = newhead;

    while(l1&&l2)
    {
        if(l1->val <= l2->val)
        {
            newcur->next = l1;
            newcur = newcur->next;
            l1 = l1->next;
        }
        else
        {
            newcur->next = l2;
            newcur = newcur->next;
            l2 = l2->next;
        }
    }
    if(l1)
    {
        while(l1)//这里改成if应该会更好些
        {
            newcur->next = l1;
            newcur = newcur->next;
            l1 = l1->next;
        }
    }
    else
    {
        while(l2)
        {
            newcur->next = l2;
            newcur = newcur->next;
            l2 = l2->next;
        }
    }
    return newhead->next;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值