剑指 Offer 25. 合并两个排序的链表

Posted on 2022-03-14 23:44  AcTourist  阅读(22)  评论(0)    收藏  举报

一、题目

 

二、题目分析

  1.双指针:为什么要这么写?按照题目地说明:合并后地节点是递增地,所以把两个链表的节点进行比较把最小的值放入到一个新的数组里,然后把数组用FOR循环变成链表形式输出

  2.我们利用双指针,再运行的过程中,肯定会有一个链表变成null,另一个链表就无法比较,所以我们最初可以用 if 进行判断哪个链表为null

三、代码

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var mergeTwoLists = function(l1, l2) {
    let tmp = new Array();
    if(l1 == null){
        return l2;
    }
    if(l2 == null){
        return l1;
    }

    while( l1 != null && l2 !=null ){
        if(l1.val <= l2.val){
            tmp.push(l1);
            l1 = l1.next;
        }else{
            tmp.push(l2);
            l2 = l2.next;
        }
    }

    if( l1 == null && l2!=null ){
        tmp.push(l2);
    }else{
        tmp.push(l1);
    }

    for(let i = 0; i<tmp.length-1; i++){
        tmp[i].next = tmp[i+1];
    }

    return tmp[0];
};

四、代码优化

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var mergeTwoLists = function(l1, l2) {
    let tmp = new ListNode(0);
    let p = tmp;

    while(l1 && l2){
        if(l1.val <= l2.val){
            p.next = l1;
            l1 = l1.next;
        }else{
            p.next = l2;
            l2 = l2.next;
        }
        p = p.next;
    }
    if( l1 == null && l2 != null ){
        p.next = l2;
    }else{
        p.next = l1;
    }

    return tmp.next;
};