• 合并两个有序链表


    合并两个有序链表

    描述

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

    示例:

    输入: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;
    }
    

    注意

    • 插入元素时,被插入链表指针不能后移,否则会漏过被插入链表的一个元素的比较
  • 相关阅读:
    UI自动化测试入门一:Python3+Selenium环境搭建
    Linux下限制进程的CPU利用率
    Linux下模拟CPU占用100%
    Java接口自动化——OkHttp框架
    Java接口自动化——Before/After注解、Parameters注解和DataProvider注解
    Java接口自动化——TestNG快速开始
    《重构 改善既有代码的设计》读书笔记-坏代码的味道
    linux-脚本问题汇总
    RocketMq源码学习-消息存储
    linux-文本处理-grep
  • 原文地址:https://www.cnblogs.com/ekkone/p/11667172.html
Copyright © 2020-2023  润新知