合并有序链表(NC33/考察次数Top9/难度中等)

Posted 码农指南

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了合并有序链表(NC33/考察次数Top9/难度中等)相关的知识,希望对你有一定的参考价值。

描述:
将两个有序的链表合并为一个新链表,要求新的链表是通过拼接两个链表的节点来生成的,且合并后新链表依然有序。

示例1
输入:
{1,4},{2,3}
返回值:
{1,2,3,4}
(题目来自牛客网)

用C++实现如下

class Solution {
public:
    /**
     * 
     * @param l1 ListNode类 
     * @param l2 ListNode类 
     * @return ListNode类
     */
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        //思路,由于有序链表的每一个节点包含val和next,处理好这两者即可   
        //第一部分,处理极端情况;
        if(l1==NULL)
            return l2;
        if(l2==NULL)
            return l1;
        //第二部分,确定表头,利用表尾进行合并;
        ListNode* head=(l1->val <= l2->val)?l1:l2;//确定表头
        ListNode* tail=head;                      //表尾tail先赋值给head,后用表尾tail来链表操作
        l1 = (head == l1)?l1->next:l1;            //此两步是在确定表头后,更新l1和l2链表
        l2 = (head == l2)?l2->next:l2;                
        while(l1 != NULL && l2 != NULL)           //当l1和l2都不为空时进行合并操作
        {
            if(l1->val <= l2->val)
            {
                tail->next = l1;                  //l1相当于现在的链表头
                l1 = l1->next;                    //被取值后需要往后移动一下
            }else{
                tail->next = l2;
                l2 = l2->next;
            }
            tail = tail->next;                    //做完一次,表尾后移一次,用 表尾 对表进行操作
        }
        //第三部分,扫尾,处理剩余部分
        tail->next = (l1 == NULL)?l2:l1;          //处理剩余下的部分
        return head;                              //返回头结点,得到链表
    }
};

纯手撕代码,如果觉得内容不错麻烦点个赞,后面陆续配上Top100算法题通俗易懂的讲解视频,可以花两个月时间完全掌握,进大厂不是梦,转行狗亲测!

以上是关于合并有序链表(NC33/考察次数Top9/难度中等)的主要内容,如果未能解决你的问题,请参考以下文章

删除有序链表中重复的元素-II(NC24/考察次数Top72/难度中等)

删除有序链表中重复的元素-II(NC24/考察次数Top72/难度中等)

合并区间(NC37/考察次数Top57/难度中等)

链表相加(NC40/考察次数Top24/难度中等)

合并区间(NC37/考察次数Top57/难度中等)

链表中环的入口节点(NC3/考察次数Top17/难度中等)