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;
}
}