日常刷题17

题目:将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入: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;
}

你可能感兴趣的:(c语言)