算法挑战1

4 阅读2分钟

21.合并两个有序链表

这道题是leecode hot100的第21题

难度: 简单

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

思路分析:

链表题,想一下链表这个数据结构, 单链表, 每个节点node都有next和val,val是该节点的值, next是指向下一节点, 这就够用了

题解语言: js

题解:

var mergeTwoLists = function (list1, list2) {
//定义两个节点来表示当前节点
    let p1 = list1;
    let p2 = list2;
    //创建一个虚拟头节点方便后续操作
    const dummyHead = new ListNode(null);
    //新建的链表头节点 定义为 虚拟头节点
    let p = dummyHead;
    //循环遍历节点
    while (p1 !== null && p2 !== null) {//一直遍历直到某一个链表是空节点
        //剩下的是排队思想,谁大谁站在前面,小的跟另一队的下一个节点来比
        if (p1.val > p2.val) {
            p.next = p2; //给新链表添加节点
            p2 = p2.next; //切换当前节点
        } else {
            p.next = p1;//给新链表添加节点
            p1 = p1.next; //切换当前节点
        }
        p = p.next;//新链表每次都新增节点了,也需要切换当前节点
    }
    //下面是为了把某链表遍历完之后(当前节点是null),之后的另一个链表的后面的元素全都拼接到新链表上
    p.next = p1 === null ? p2 : p1;
    //返回新链表
    return dummyHead.next;
};

举个例子吧, 小学每个学期都会排座位吧, 怎么分的, 是按身高吧

我们分成两队, 低的站前边,高的站后面(这两队短,同学们自己来比着排,有没有勾起了你儿时的回忆呢?)

然后每一队的第一个同学进行比较

谁低谁去站到新的一队后面

就这么一直比

就能得到一个新的身高是升序的队

这个解法也是这样的,两个链表一直比

比到其中一队没人了,那剩下的一队全都按顺序站到新队的后面就好了

是不是很简单