之前对链表不太熟悉,然后就做了第二题,所以趁热打铁再找一些链表的题做做,加深一下对链表的理解。
合并两个有序链表,我之前做第二题的时候,查资料的时候就遇到过。
链表合并 资料放在这,但是这个好像没有考虑我接下来说的问题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;
}
};
最后放一下运行时间图
跪请大神提出更好的建议!!!