题目:
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4
解题思路:
刚开始,我把题目理解成了:单纯地合并两个链表(像这样:l1->l2->l1->l2~~~~)
事实上题目的意思中还有一层意思是:小的数放在大的数前面。
刚开始的代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
struct ListNode *first,*second,*temp1,*temp2;
first=l1;
second=l2;
temp1=first;
temp2=second;
//两个链表中一个为空,或两个都为空
if(l1==NULL&&l2!=NULL) return l2;//l1空,l2非空时
if(l2==NULL) return l1;//l1非空,l2空时;或者l1和l2都空时
//l1和l2都非空
while(first->next!=NULL&&second->next!=NULL)
{
temp1=first->next;
temp2=second->next;
first->next=second;
second->next=temp1;
first=temp1;
second=temp2;
}
temp1->next=temp2;
return l1;
}
修改后的正确代码:
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
struct ListNode *head;
struct ListNode *ret;
if(!l1 && l2)//l1空且l2非空
return l2;
if(!l2)//l2空,l1随意
return l1;
//l1和l2都非空
if(l1->val <= l2->val)
{
head = l1;
l1 = l1->next;
}
else
{
head = l2;
l2 = l2->next;
}
ret = head;
while(l1 && l2)
{
if(l1->val < l2->val)
{
head->next = l1;
l1 = l1->next;
}
else
{
head->next = l2;
l2 = l2->next;
}
head->next->next = NULL;
head = head->next;
}
if(l1)
head->next = l1;
else if(l2)
head->next = l2;
return ret;
}
然而效率却很低:
排行榜上的一种优秀代码:
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2)
{
struct ListNode* phead=NULL;
struct ListNode* pc;
struct ListNode* p1=l1;
struct ListNode* p2=l2;
if(p1==NULL) return p2;
if(p2==NULL) return p1;
if(p1==NULL&&p2==NULL) return NULL;
if(p1->val<=p2->val)
{
phead=p1;
p1=p1->next;
}
else
{
phead=p2;
p2=p2->next;
}
pc=phead;
while(p1&&p2&&pc)
{
if(p1->val<=p2->val)
{
pc->next=p1;
pc=p1;
p1=p1->next;
}
else
{
pc->next=p2;
pc=p2;
p2=p2->next;
}
}
if(p1) pc->next=p1;
if(p2) pc->next=p2;
return phead;
}