合并链表:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
在网上看到的一个感觉还挺厉害的解法,利用了递归调用,感觉链表居然还能跟递归扯上关系,打开了新思路
见代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
if(list1==NULL)return list2;
if(list2==NULL)return list1;
struct ListNode* mergedList;
if(list1->val<=list2->val)
{
mergedList=list1;
mergedList->next=mergeTwoLists(list1->next,list2);
}
else
{
mergedList=list2;
mergedList->next=mergeTwoLists(list1,list2->next);
}
return mergedList;
}
这是两个链表(没有头结点),list1指向第一个链表的首个结点,list2指向第二个链表的首个结点,然后mergedList指向的是排序之后形成的新的链表
另外一种解法:
/**
* 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 *p1,*p2;
p1=(ListNode*)malloc(sizeof(ListNode));
p2=p1;
while(l1!=NULL&&l2!=NULL)
{
if(l1->val<=l2->val)
{
p2->next=l1;
l1=l1->next;
p2=p2->next;
}
else
{
p2->next=l2;
l2=l2->next;
p2=p2->next;
}
}
if(l1!=NULL)p2->next=l1;
if(l2!=NULL)p2->next=l2;
return p1->next;
}
这两个代码都是在力扣网站上看到的题解,真的很服那个递归调用的。