/*————danny的常规方法,注意和回文链表进行区别,这个可以直接用两个现有的链表进行构造,因为原有链表不需要保留;
                                            而前面的回文链表需要保留原来链表进行对比,所以不能像这题这样操作。*/
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
    //(1)如果l1/l2有空的,则直接将另一个链表给返回
    if(!l1){
        return l2;
    }
    if(!l2){
        return l1;
    }
    //(2)创建一个头结点并初始化
    struct ListNode *head = (struct ListNode*)malloc(sizeof(struct ListNode));
    head->next = NULL;  // 防止脏数据
    struct ListNode* s = head;  // 使用s进行操作,而不是头结点head 
    //(3)对以head为头结点的链表进行构造(只是对地址操作,并不是创建大量结点)
    while(l1 && l2){
        if(l1->val < l2->val){
            s->next = l1;
            l1 = l1->next;
        }
        else{
            s->next = l2;
            l2 = l2->next;
        }
        s = s->next;  // 因为x最开始指向的是头结点,每次将下一个位置安排好后,将t移到新链表的最后一个位置
    }
    //(4)如果都有数据的区间结束,l1还有元素,则t后面直接接剩余的值
    if(l1){
        s->next = l1;
    }
    else if(l2){
        s->next = l2;
    }
    //(5)将构造好的链表的第一个具体结点返回
    return head->next;  
}
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务