struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
//l2作为被合链表,l1作为合入链表
if(l1==NULL)
return l2;
if(l2==NULL)
return l1;
struct ListNode *l1_q = l1, *l2_q = l2, *pre = NULL, *r;//工作指针q
while(l1_q!=NULL&&l2_q!=NULL)
{
if(l1_q->val <= l2_q->val)
{
pre = l1_q;
l1_q = l1_q->next;
}
else
{
r = l2_q->next;//将l2节点插入
l2_q->next = l1_q;
if(pre==NULL)//防止l2第一个结点小于l1第一个结点,导致出错
{
pre = l2_q;
l1 = pre;//注意l1表头
}
else
{
pre->next = l2_q;
pre = pre->next;
}
l2_q = r;
}
}
//检测l2链表是否为空
if(l2_q!=NULL)
pre->next = l2_q;
return l1;
}
新思路
引入哑结点,依次比较两个链表,每次选择值最小的结点进行连接
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
struct ListNode *l1_q = l1, *l2_q = l2, *prehead = (struct ListNode*)malloc(sizeof(struct ListNode));//工作指针q
struct ListNode *pre = prehead;//注意这里!
while(l1_q!=NULL&&l2_q!=NULL)
{
if(l1_q->val <= l2_q->val)
{
pre->next = l1_q;
pre = l1_q;
l1_q = l1_q->next;
}
else
{
pre->next = l2_q;
pre = l2_q;
l2_q = l2_q->next;
}
}
//检测哪个链表是否为空
if(l2_q!=NULL)
pre->next = l2_q;
else
pre->next = l1_q;
return prehead->next;
}
当然少不了递归,但是空间复杂度会增加
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
//终止条件
if(l1==NULL)
return l2;
else if(l2==NULL)
return l1;
else if(l1->val <= l2->val)
{
l1->next = mergeTwoLists(l1->next,l2);//注意出栈时,要有接收信号的指针
return l1;
}
else
{
l2->next = mergeTwoLists(l1,l2->next);
return l2;
}
}