力扣--合并两个有序链表

合并两个有序链表

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

示例1
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例2
输入:l1 = [], l2 = []
输出:[]
示例3
输入:l1 = [], l2 = [0]
输出:[0]


C

法一
思路

1.先判断两表是否为空
2.创建新表用于存储合并后的升序数据

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
    //定义一个新表用来存储有序之后的数
    struct ListNode *L = NULL, *r, *s ;
    //判断两表是否为空
    if(!list1){
        return list2;
    }
    if(!list2){
        return list1;
    }
    //循环当两表都存在时
    while(list1 && list2){
        //每次循环需要创建新的结点去存储数据
        s = (struct ListNode *)malloc(sizeof(struct ListNode));
        //判断两表的数值大小并存储到新表
        if(list1->val <= list2->val){
            s->val = list1->val;
            list1 = list1->next;
        }else{
            s->val = list2->val;
            list2 = list2->next;
        }
        //判断表是否为空
        if(!L){
            L = s;
        }else{
            //不为空
            r->next = s;
        }
        r = s;
    }
    
    //将余下的表中的剩余元素并入新表
    while(list1){
        s = (struct ListNode *)malloc(sizeof(struct ListNode));
        s->val = list1->val;
        list1 = list1->next;
        r->next = s;
        r = s;
    }
    //
    while(list2){
        s = (struct ListNode *)malloc(sizeof(struct ListNode));
        s->val = list2->val;
        list2 = list2->next;
        r->next = s;
        r = s;
    }
    //表尾至空
    r->next = NULL;

    //返回表头
    return L;

}

法二
思路

不再创建新表,每次循环都要动态分配内存给结点,太过浪费内存。
只需要创建一个表头,将两表中符合条件的结点一次连接起来即可。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
    //不创建新表,循环中每次都需要给结点动态分配内存,内存上的消耗过于大

    //直接将两个表中复合条件的结点按顺序联系起来即可

    //第一步还是判断两表是否为空
    if(!list1){
        return list2;
    }
    if(!list2){
        return list1;
    }

    //创建一个空表头
    struct ListNode *L = (struct ListNode *)malloc(sizeof(struct ListNode));
    //p1指向List1 ,p2指向List2 ,s指向L->next
    struct ListNode *p1, *p2 , *s;
    p1 = list1;
    p2 = list2;
    s = L;
    while(p1 && p2){
        if(p1->val <= p2->val){
            s->next = p1;
            s = p1;
            p1 = p1->next;
        }else{
            s->next = p2;
            s = p2;
            p2 = p2->next;
        }
    }
    if(!p1){
        s->next = p2;
    }
    if(!p2){
        s->next = p1;
    }
    return L->next;

}

JS

代码

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} list1
 * @param {ListNode} list2
 * @return {ListNode}
 */
var mergeTwoLists = function(list1, list2) {
    let p1 = list1
    let p2 = list2
    let newList = new ListNode(null)
    let p3 = newList
    if(!p1){
        return p2
    }
    if(!p2){
        return p1
    }
    while(p1 && p2){
        if(p1.val <= p2.val){
            p3.next = p1
            p3 = p1
            p1 = p1.next
        }else{
            p3.next = p2
            p3 = p2
            p2 = p2.next
        }        
    }

    while(p1){
        p3.next = p1
        p3 = p1
        p1 = p1.next
    }
    while(p2){
        p3.next = p2
        p3 = p2
        p2 = p2.next
    }
    //
    return newList.next
};

你可能感兴趣的:(算法,链表,leetcode,数据结构)