题目:将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
(来源:力扣(LeetCode))
思路:开辟一个新的链表,同时遍历输入的两个链表,当第一个链表里的元素与第二个链表里的元素相等时,依次放入新链表;当第一个链表里的元素小于第二个链表里的元素时,将第一个链表里的元素插入新链表,再比较第一个链表里的下一个元素和第二个链表里元素的关系;当第一个链表里的元素大于第二个链表里的元素时,将第二个链表里的元素插入新链表,再比较第二个链表里的下一个元素和第一个链表里元素的关系;最后,当一个链表里已经没有元素了,而另一个链表里仍有元素时,将剩余的这部分直接插入新链表。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2)
{
struct ListNode *l3;
struct ListNode *p,*q,*r,*s;
int x;
l3=(struct ListNode*)malloc(sizeof(struct ListNode));
l3->next=NULL;
r=l3;
p=l1;
q=l2;
while(p!=NULL&&q!=NULL)
{
if(p->val==q->val)
{
x=p->val;
s=(struct ListNode*)malloc(sizeof(struct ListNode));
s->val=x;
r->next=s;
r=s;
p=p->next;
x=q->val;
s=(struct ListNode*)malloc(sizeof(struct ListNode));
s->val=x;
r->next=s;
r=s;
q=q->next;
}
else if(p->val<q->val)
{
x=p->val;
s=(struct ListNode*)malloc(sizeof(struct ListNode));
s->val=x;
r->next=s;
r=s;
p=p->next;
}
else
{
x=q->val;
s=(struct ListNode*)malloc(sizeof(struct ListNode));
s->val=x;
r->next=s;
r=s;
q=q->next;
}
}
if(p!=NULL)
r->next=p;
else if(q!=NULL)
r->next=q;
else
r->next=NULL;
return l3->next;
}