LeetCode解題心得:
原題:合併兩個排序的鏈接列表,並將其作爲新列表返回。 新列表應通過將前兩個列表的節點拼接在一起。
鏈表的歸併:有遞歸和非遞歸兩種方法:
1.非遞歸方法:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
//做一些判斷
if(l1 == NULL) return l2;
if(l2 == NULL) return l1;
if(l1==NULL && l2==NULL) return NULL;
//首先找到歸併後鏈表的頭
struct ListNode *mergehead=NULL;
if(l1->val < l2->val)
{
mergehead=l1;
l1=l1->next;
}
else
{
mergehead=l2;
l2=l2->next;
}
//然後開始歸併
struct ListNode *p=mergehead; // 放在這裏纔對
while(l1!=NULL && l2!=NULL)
{
if(l1->val < l2->val)
{
p->next=l1;
l1=l1->next;
}
else
{
p->next=l2;
l2=l2->next;
}
p=p->next;
}
if(l1 != NULL) p->next=l1; //如果還剩下l1沒有歸併完,則把l1加到新鏈表
if(l2 != NULL) p->next=l2; //如果還剩下l2沒有歸併完,則把l2加到新鏈表
return mergehead;
}
2.遞歸方法-1:
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
if(l1 == NULL) return l2;
if(l2 == NULL) return l1;
struct ListNode *mergehead=NULL;
if(l1->val < l2->val)
{
mergehead=l1;
mergehead->next=mergeTwoLists(l1->next,l2);
}
else
{
mergehead=l2;
mergehead->next=mergeTwoLists(l1,l2->next);
}
return mergehead;
}
2.遞歸方法-2:
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
if(l1 == NULL) return l2;
if(l2 == NULL) return l1;
if(l1->val < l2->val)
{
l1->next=mergeTwoLists(l1->next,l2);
return l1;
}
else
{
l2->next=mergeTwoLists(l1,l2->next);
return l2;
}
}