这道题想要提高效率,必须考虑到的一点是,当一其中一个链表空了的时候,可以直接把另一个链表剩余部分整个拼上去,不需要一个一个遍历。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
struct ListNode* head = NULL;
struct ListNode* p = NULL;
if(!l1)
return l2;
else if(!l2)
return l1;
if(l1->val<l2->val){
head = l1;
l1 = l1->next;
}else{
head = l2;
l2 = l2->next;
}
p = head;
while(l1||l2){
if(l1&&l2){
if(l1->val<l2->val){
p->next = l1;
l1 = l1->next;
}else{
p->next = l2;
l2 = l2->next;
}
}else if(l1){
p->next = l1;
break;
}else if(l2){
p->next = l2;
break;
}
p=p->next;
}
return head;
}
还有一种递归算法,效率差不多,可是递归算法不容易想明白。大概理解为按顺序读取进栈,然后递归返回时进行链表的组装。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
struct ListNode* result=NULL;
if(l1==NULL)
{
return(l2);
}
if(l2==NULL)
{
return(l1);
}
if(l1->val<=l2->val)
{
result = l1;
result->next=mergeTwoLists(l1->next,l2);
}
else
{
result=l2;
result->next=mergeTwoLists(l1,l2->next);
}
return result;
}