21.合并两个有序链表

只谈情不闲聊 提交于 2020-03-04 19:49:48

在这里插入图片描述
无比丑陋的代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        if(!l1) return l2;
        if(!l2) return l1;
        auto l3 = l1;
        auto l4 = l2;
        if(l1->val > l2->val)//保证ll是小的
        {
            l1 = l2;
            l2 = l3;
        }
        auto res = l1;
        while(l1->next && l2)
        {
            if(l1->next -> val <= l2 ->val) l1 = l1 ->next;
            else
            {//画图比较清楚
                l4 = l2->next;//保存l2下一个数
                l3 = l1->next;//保存l1下一个数
                l1->next = l2;//拼接
                l1 = l1->next;//l1走一步
                l1->next = l3;//继续拼接
                l2 = l4;//l2走一步
            }

        }
        while(l2)//如果l1里末尾元素比l2末尾元素小,则l2会剩下元素,需要放入l1
        {
            l1->next = new ListNode(l2->val);
            l1 = l1->next;
            l2 = l2->next;            
        }
        return res;
    }
};

就这竟然通过了…

说说逻辑:
1.归并的思想
2.首先交换链表1和2,使得头数字小的链表是l1,引入了中间变量l3.
3.链表的特性是访问不了前一个数字,所以l1在往后走之前要判断后面的数是不是比l2大,后面的数如果比l2大,就需要先插入l2的数,然后再往下走一步。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!