将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
法一:创建一个空链表,比较两个链表的元素,谁小把谁放进去
//该代码便于理解,但重复代码过多
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
//有可能其中一个链表为空,有可能两个链表都为空
//判空
if(list1==NULL)
return list2;
if(list2==NULL)
return list1;
//定义循环链表的指针
ListNode* l1,*l2;
l1=list1;
l2=list2;
//定义新链表的指针
ListNode* newhead,*newtail;
newhead=newtail=NULL;
while(l1&&l2)//注意不是||
{
if(l1->val<l2->val)
{
if(newhead==NULL)
{
newhead=newtail=l1;
}
else
{
newtail->next=l1;
newtail=newtail->next;
}
l1=l1->next;//这一句千万别忘记了,不然死循环
}
else
{
if(newhead==NULL)
{
newhead=newtail=l2;
}
else
{
newtail->next=l2;
newtail=newtail->next;
}
l2=l2->next;//这一句老忘,下次千万别忘了!
}
}
//因为跳出while循环时一定只有一个为空,所以要把另一个链表剩下的的元素直接接上
//因为原链表也是升序链表
if(l1)
newtail->next=l1;
if(l2)
newtail->next=l2;
//头节点没动,直接返回
return newhead;
}
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
//有可能其中一个链表为空,有可能两个链表都为空
//判空
if(list1==NULL)
return list2;
if(list2==NULL)
return list1;
//定义循环链表的指针
ListNode* l1,*l2;
l1=list1;
l2=list2;
//定义新链表的指针
ListNode* newhead,*newtail;
newhead=newtail=(ListNode*)malloc(sizeof(ListNode));
while(l1&&l2)//注意不是||
{
if(l1->val<l2->val)
{
newtail->next=l1;
newtail=newtail->next;
l1=l1->next;//这一句千万别忘记了,不然死循环
}
else
{
newtail->next=l2;
newtail=newtail->next;
l2=l2->next;//这一句老忘,下次千万别忘了!
}
}
//因为跳出while循环时一定只有一个为空,所以要把另一个链表剩下的的元素直接接上
//因为原链表也是升序链表
if(l1)
newtail->next=l1;
if(l2)
newtail->next=l2;
//头节点没动,直接返回
//return newhead->next;//这个地方别忘了返回下一个节点
//因为此时的newhead中的值是系统随机给的,他的下一个节点才是真正的第一个节点
//最后要将动态申请的空间释放掉
ListNode* ret=newhead->next;
free(newhead);
newhead=NULL;
return ret;
}