寒假结束,今天开始进入学习状态,现在到LeetCode21题,将两个有序链表进行合并,这个应该是数据结构必会的一个题目。
分析:
这个题目简单,但是判断条件比较多,需要考虑周到;首先判断两个输入链表是否为空,都会空的话,就返回空指针,其中一个为空,就返回另外一个。接下来从头开始遍历两个链表,比较大小,哪个小就连接到新的链表尾部,并向后移动一位,直到出现一个链表为空。最后判断哪个链表先为空就将令一个链表剩余尾部连接到新的链表尾部,最后输出新的链表的头。
问题:
1、考虑各种出现的情况,为空;
2、时间效率很低,这个没有弄懂,其他人用的递归遍历可以减少时间(不明白为什么),可以优化
附上代码:
/**
* 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) {
if(l1==NULL&&l2==NULL)
return NULL;
if(l1==NULL)
return l2;
if(l2==NULL)
return l1;
ListNode *head=new ListNode(0);
ListNode *r=head;
while(l1&&l2)
{
if(l1->val>l2->val)
{
r->next=l2;
l2=l2->next;
}
else
{
r->next=l1;
l1=l1->next;
}
r=r->next;
}
if(l1)
r->next=l1;
if(l2)
r->next=l2;
return head->next;
}
};