写在前面:本文题单均来自力扣的算法刷题计划,开这个系列主要是以题目与题解的形式对一些常见、常用算法进行归类和总结,希望在促进自己学习的同时也能帮助到看到这篇文章的大家。另外,本文并非一天一更~
目录
题目一:21. 合并两个有序链表
题目描述:
题目分析:
先创建一个新的空链表,然后不断比较题目给出的两个链表各个节点的大小,取最小的连接到新链表上,当有一方链表的next指针为NULL时,把另一方链表的剩余节点全部连接在新链表上即可。
另:看题解看到一种巧妙而简洁的递归方法,也加在题解里了。
题解代码:
/**
* 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 *head = new ListNode(); //创建带头结点的新链表
ListNode *last = head;
while(list1 != nullptr && list2 != nullptr) //两方都非空
{
if(list1->val > list2->val) //取较小的节点连接
{
last->next = list2;
list2 = list2->next;
}
else
{
last->next = list1;
list1 = list1->next;
}
last = last->next;
}
if(list1 == nullptr) // 一方为空时
{
last->next = list2;
}
if(list2 == nullptr)
{
last->next = list1;
}
return head->next;
}
};
//递归
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
if(l1==NULL)
return l2;
if(l2==NULL)
return l1;
if(l1->val < l2->val){
l1->next = mergeTwoLists(l1->next,l2);
return l1;
}else{
l2->next = mergeTwoLists(l1,l2->next);
return l2;
}
}
题目二:206. 反转链表
题目描述:
题目分析:
这题我是运用双指针求解的,将head的首位提出,再将其剩下的一段的首位的next指针指向刚提出的首位,
比如:1->2->3->4->5
执行上述步骤后得到:2->1
接着将处理过的1和2删去,剩下:3->4->5
下一步与上面类似,把上面得到的链表(2->1)当成首位即可得出:3->2->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* reverseList(ListNode* head) {
if(head == nullptr)
return nullptr;
ListNode *pre = nullptr,*cur = head;
while(cur != nullptr)
{
auto temp = cur->next;
cur->next = pre;
pre = cur;
cur = temp;
}
return pre;
}
};