合并有序链表(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/难度中等)