前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >21. 合并两个有序链表

21. 合并两个有序链表

作者头像
chuckQu
发布2022-08-19 14:21:33
1660
发布2022-08-19 14:21:33
举报
文章被收录于专栏:前端F2E

21. 合并两个有序链表

力扣题目链接[1]

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

示例一:

代码语言:javascript
复制
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

「提示:」

  • 两个链表的节点数目范围是 [0, 50]
  • 100 <= Node.val <= 100
  • l1l2 均按 「非递减顺序」 排列

思路:

有序链表的合并问题,是最经典的链表题目,考查链表的遍历与末尾的判断。

这里我们声明一个哨兵节点作为新链表的起始位置。然后开始比较两个链表的值,将具有较小值的链表节点赋值给新链表当前节点的next指针。然后新链表和待排序链表的当前指针都向后移动一位继续下个节点的比较。

当list1或者list2为空时,跳出循环。此时可能还有另一个链表的指针还没有走到末尾,因此直接将尚未走完的链表赋值给新链表当前节点的next指针。

最后返回哨兵节点的下一个节点引用即可。因为哨兵节点是用于串联起一个链表,最终结果中不能包含该节点。

完整代码如下:

哨兵节点

代码语言:javascript
复制
/**
 * 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 head = new ListNode(0); // 初始化哨兵节点
    let cur = head; // 指向cur指针
    while(list1 && list2) { // 找到两个链表的较小者,追加到新链表中
        if (list1.val < list2.val) {
            cur.next = list1; // cur的next指向较小节点
            list1 = list1.next; // 头部指向下个节点
        } else {
            cur.next = list2;
            list2 = list2.next;
        }
        cur = cur.next; // 指向下一个节点
    }
    cur.next = list1 || list2; // 继续拼接尚未遍历完的链表
    return head.next; // 返回哨兵节点的下一个节点
};

总结

本题考查有序链表的合并。在链表的排序中,也会使用到有序链表的合并,同时还用到了二分法以及归并排序。是一道值得掌握的算法题。

参考资料

[1]

力扣题目链接: https://leetcode-cn.com/problems/merge-two-sorted-lists/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端F2E 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 21. 合并两个有序链表
    • 哨兵节点
      • 总结
        • 参考资料
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档