• 合并两个有序链表


    合并两个有序链表

    描述

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

    示例:

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

    思路

    • 有空链表时,返回另一个链表,无论另一个链表是否为空链表皆符合规则
    • 将首元素较小的链表设为被插入链表,另一个设为插入链表,被插入链表即最后返回的链表
    • 当前插入链表非空或被插入链表还有下一个元素时,如果插入链表的元素不大于被插入链表下一个元素,则插入到下一个元素之前,否则当前插入链表往后递增
    • 插入链表仍有元素存在时(当有大于被插入链表最后一个数时,上个过程不会插入进去),需要直接接在被插入链表后
    struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
        struct ListNode* l_get_buffer,*l_set_buffer,*l_final,*l_get,*l_set;
        //有空链表时
        if(!(l1 && l2)) {
            return l1?l1:l2;//l1非空则返回l1,否则返回l2
        }
        //l_set设为首元素较小的一个
        l_set = (l1->val <= l2->val)?l1:l2;
        l_get = (l_set == l1)?l2:l1;
        //最终返回首元素较小的链表
        l_final = l_set;
        while (l_get != 0 && l_set->next != 0)
        {
            if((l_get->val) <= (l_set->next->val))  {
                //记录当前两个指针
                l_get_buffer = l_get;
                l_set_buffer = l_set;
                //next指针更新   
                l_get = l_get->next; 
                //指针重组  
                l_get_buffer->next = l_set_buffer->next;
                l_set_buffer->next = l_get_buffer; 
            }  
            else 
                l_set = l_set->next;
        }
        //有剩余元素未插入
        if(l_get != 0)
            l_set->next = l_get;
        return l_final;
    }
    

    注意

    • 插入元素时,被插入链表指针不能后移,否则会漏过被插入链表的一个元素的比较
  • 相关阅读:
    梅森数 洛谷p1045
    高精度算法
    并查集(算法)
    各种背包模板
    爬虫作业
    numpy、scipy、pandas、matplotlib的读书报告:
    体育竞技分析羽毛球
    聊斋相关的分词,出现次数最高的20个
    在终端输出如下信息,(两种以上方法)
    7段数码管绘制
  • 原文地址:https://www.cnblogs.com/ekkone/p/11667172.html
Copyright © 2020-2023  润新知