leetcode.21(合并链表)

之前对链表不太熟悉,然后就做了第二题,所以趁热打铁再找一些链表的题做做,加深一下对链表的理解。

合并两个有序链表,我之前做第二题的时候,查资料的时候就遇到过。
链表合并 资料放在这,但是这个好像没有考虑我接下来说的问题2 。

然后我们来具体看一下这个题。

Q:将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

提交的时候要考虑几个问题:
1,如果有一个链表是空的,那就直接返回另一个链表,后来看评论说,如果返回结果有多个,会有不同的速度,我测试了三次,C++这里好像没什么变换,就直接把判断链表是否为空放在前面就行。
提交记录

2,可能会出现诸如
l1=[-9,3] l2=[5,7]
这个时候就不能直接l1[1]和l2[1]这样判断大小了。

 while(((l1->next)!=NULL)&&((l1->next->val)<val2))
                {
                    l1=l1->next;
                    temp->next =new ListNode (l1->val);
                    temp= temp->next;
                }

就要通过上面这个程序段来判断后面的值是不是比前面最大值要小。
最后完整的程序如下:

大致思路就是,先看看有没有空的链表,如果没有空的链表,就开始比较,直到较短链表的结束。最后再把长的链表剩下的放进去。

中间就是要有一个和后面值判断的过程,C++还是学的很菜,感觉程序写的很冗长,但也不知道怎么把它写的简练一些,希望有大神提出一些意见。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        int val1,val2,temp_max;
        ListNode *new_list=new ListNode(0);
        ListNode *temp=new_list;
        if(l1==NULL)return l2;//有一个链表为空,就直接返回另一个链表
        if(l2==NULL)return l1;
        while(l1!=NULL&&l2!=NULL)//先把短的结束了,再把长的插进去
        {
            val1=l1->val;val2=l2->val;
            if(val1<val2)
            {
                temp->next =new ListNode (val1);
                temp= temp->next;
                while(((l1->next)!=NULL)&&((l1->next->val)<val2))
                {
                    l1=l1->next;
                    temp->next =new ListNode (l1->val);
                    temp= temp->next;
                }
                temp->next =new ListNode (val2);
                temp= temp->next;
                if(l1!=NULL)l1=l1->next;
                if(l2!=NULL)l2=l2->next;
            }
            else 
            {
               
                temp->next =new ListNode (val2);
                temp= temp->next;
                while(((l2->next)!=NULL)&&((l2->next->val)<val1))
                {
                    l2=l2->next;
                    temp->next =new ListNode (l2->val);
                    temp= temp->next;
                }
                temp->next =new ListNode (val1);
                temp= temp->next; 
                if(l1!=NULL)l1=l1->next;
                if(l2!=NULL)l2=l2->next;
            }
        }
        while(l2!=NULL)
        {
            temp->next=new ListNode(l2->val);
            temp=temp->next;
            l2=l2->next;
        }
        while(l1!=NULL)
        {
            temp->next=new ListNode(l1->val);
            temp=temp->next;
            l1=l1->next;
        }
        return new_list->next;
    }
};

最后放一下运行时间图
在这里插入图片描述

跪请大神提出更好的建议!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值