合并两个有序链表

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

解法1(递归):

思路: 初始化一个头节点head,两个链表的第一个节点比较,取较小的节点连接在head上,使用递归的方法使除去该节点的两个链表重复上述步骤,直至一个链表结束(或同时结束),最后返回head头节点。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
    struct ListNode* head;

    if(l1==NULL){
        return l2;
    }else if(l2==NULL){
        return l1;
    }
    
    if(l1->val<l2->val){
        head=l1;
        head->next=mergeTwoLists(l1->next,l2);
    }else{
        head=l2;
        head->next=mergeTwoLists(l1,l2->next);
    }
    return head;
}

解法2:

思路: 与上面算法思路相似,只是下面算法没有使用递归。该算法需注意这句( tail->next=l1 ? l1 : l2 ;),这句处理的是比较后,有剩余节点的链表拼接在tail后

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) 
{
    struct ListNode *head,*tail;
    if(l1==NULL)
        return l2;
    else if(l2==NULL)
        return l1;
    if(l1->val<l2->val)
    {
        head=l1;
        l1=l1->next;
    }
    else
    {
        head=l2;
        l2=l2->next;
    }
    tail=head;
    while(l1 && l2)
    {
        if(l1->val < l2->val)
        {
            tail->next=l1;
            l1=l1->next;
        }
        else
        {
            tail->next=l2;
            l2=l2->next;
        }
        tail=tail->next;
    }
    
    tail->next=l1?l1:l2;
    return head;
}
    原文作者:coder_flag
    原文地址: https://www.jianshu.com/p/29af5875c3fb
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞