无比丑陋的代码:
/**
* 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的数,然后再往下走一步。
来源:CSDN
作者:邢海博
链接:https://blog.csdn.net/weixin_42899329/article/details/104651329