题目描述
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
算法思路
1.暴力解法(一点也不暴力)-- 看了官方题解的文字说明版 这是一种迭代的思想
比较链表中的元素大小 重新将链表链接起来 设置链表哑节点
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
ListNode dummy = ListNode(-1);//哨兵节点 比较好返回题目最后所需结果
ListNode *prev = &dummy;
while(list1 != nullptr && list2 != nullptr)
{
//判断list1、list2的大小,指向小的节点
if(list1->val < list2->val )
{
prev->next=list1;//
list1=list1->next;//节点遍历
}
else
{
prev->next=list2;
list2=list2->next;
}
//迭代
prev=prev->next;
}
prev->next = list1 == nullptr?list2:list1;
return dummy.next;//返回哨兵节点的next指针
}
};
官方题解:
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode prehead = new ListNode(-1);
ListNode prev = prehead;
while (l1 != null && l2 != null) {
if (l1.val <= l2.val) {
prev.next = l1;
l1 = l1.next;
} else {
prev.next = l2;
l2 = l2.next;
}
prev = prev.next;
}
// 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可
prev.next = l1 == null ? l2 : l1;
return prehead.next;
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/solution/he-bing-liang-ge-you-xu-lian-biao-by-leetcode-solu/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
返回的是这个
题目标签
递归、链表
下题规划
- 此题的递归做法
刷题总结
我本来以为力扣里的链表题用C++的话会涉及到list类的使用
然后也花了一点时间先去学链表的基本思想
即便是有先看视频了解链表的结构和思想,但在应用中仍然不习惯这种用法
感觉有点抽象。没有把指针和链表联系起来。
此题有很巧妙的递归思想,但还是先从暴力解法开始
我发现我一看到题目就束手无策,甚至连一定能用暴力破解都给吓到忘记了。日后留意。
递归先不学,先熟练掌握刷题中的链表思想和操作。