美文网首页
合并两个有序链表

合并两个有序链表

作者: Lularible | 来源:发表于2020-03-10 16:45 被阅读0次

LeetCode第二十一题

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

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists

思路

因为节点插入操作要获得插入位置之前的那个节点,所以取第一个值更小的那个链表为母链表,将另外一个链表节点插入至母链表中即可。其中注意插入节点的写法和边界条件的处理。

源代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
    if(!l1)
        return l2;
    if(!l2)
        return l1;
    struct ListNode * small;
    struct ListNode * large;
    struct ListNode * l;
    struct ListNode * head;
    struct ListNode * rear;
    if(l1->val < l2->val){              //以最小值更小的链表作为母链表
        small = l1;
        large = l2;
    } 
    else{
        small = l2;
        large = l1;
    }
    head = small;                       //head保存母链表首节点
    rear = small;                       //rear指向已经排好序的序列的尾节点
    small = small->next;                
    while(small && large){
        if(small->val >= large->val){
            l = large->next;            //暂存large的下一个节点指针
            large->next = rear->next;   //将large指向的节点插入母链表
            rear->next = large;
            rear = large;
            large = l;                  //large移动至下一个节点
        }
        else{
            rear = small;
            small = small->next;
        }
    }
    if(large)
        rear->next = large;
    return head;
}

分析

时间复杂度为线性级别,空间复杂度为常数级别。
此版本直接将一个链表作为母链表。另外一种做法是将两个链表中第一个值更小的那一个节点从原链表中断开,作为新链表的首节点,然后将这两个链表的节点插入这个新链表中。这样会更加易于处理。

相关文章

  • leecode刷题(23)-- 合并两个有序链表

    leecode刷题(23)-- 合并两个有序链表 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回。新...

  • 合并单链表

    合并两个有序链表非递归实现 合并两个有序链表递归实现

  • leetcode 链表 [C语言]

    21. 合并两个有序链表 合并两个有序链表 61. 旋转链表 (快慢指针) 61. 旋转链表 相关标签 : 链表 ...

  • ARTS-Week6 有序链表合并、DevOps、Json解析、

    Algorithm LeetCode原题链接: 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回。新链...

  • 2018-12-26

    问题列表 合并两个有序链表 合并K个排序链表 合并区间 插入区间 问题与反馈 总结与收获 多个有序链表的合并,类似...

  • leetcode的题目21

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

  • Swift 合并两个有序链表 - LeetCode

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

  • LeetCode 21. 合并两个有序链表

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

  • 刷leetCode算法题+解析(四)

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

  • Swift - LeetCode - 合并两个有序链表

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

网友评论

      本文标题:合并两个有序链表

      本文链接:https://www.haomeiwen.com/subject/sbfgdhtx.html