
🔥小叶-duck:个人主页
❄️个人专栏:《Data-Structure-Learning》
《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--优选算法
✨未择之路,不须回头
已择之路,纵是荆棘遍野,亦作花海遨游
目录
链表常用技巧以及操作总结:



51.两数相加
题目链接:
题目描述:

题目示例:

解法(模拟):
算法思路:
两个链表都是逆序存储数字 的,即两个链表的个位数、十位数等都已经对应,可以直接相加 。
在相加过程中,我们要注意是否产生进位 ,产生进位时需要将进位和链表数字一同相加。如果产生进位的位置在链表尾部 ,即答案位数比原链表位数长一位 ,还需要再 new 一个结点储存最高位。
C++算法代码:
cpp
/**
* 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* addTwoNumbers(ListNode* l1, ListNode* l2)
{
ListNode* cur1 = l1;
ListNode* cur2 = l2;
int sum = 0;//求和顺带获取进位值
ListNode* ans = new ListNode(0);
ListNode* head = ans;//用于记录尾指针位置
while(cur1 || cur2 || sum)
//注意当两个链表都走到尾部可能还有进位值,所以判断条件sum也要考虑在内
{
if(cur1)
{
sum += cur1->val;
cur1 = cur1->next;
}
if(cur2)
{
sum += cur2->val;
cur2 = cur2->next;
}
head->next = new ListNode(sum % 10);
head = head->next;
sum /= 10;
}
head = ans->next;//重新记录链表的头节点,便于返回
delete ans; //new出来的空间结束前及时delete
return head;
}
};
52.两两交换链表中的节点
题目链接:
题目描述:

题目示例:

解法(模拟):
算法思路:
只需要把题目示例画图画出来模拟交换过程即可,但必须要通过画图来进行理解操作过程!
C++算法代码:
cpp
/**
* 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* swapPairs(ListNode* head)
{
//解法:循环、迭代(模拟算法)
if(head == nullptr || head->next == nullptr)
{
return head;
}
ListNode* ret = new ListNode(0);
ret->next = head;
ListNode* prev = ret;
ListNode* cur = prev->next;
ListNode* next = cur->next;
ListNode* nnext = next->next;
while(1)
{
//交换结点
prev->next = next;
next->next = cur;
cur->next = nnext;
prev = prev->next->next;
if(prev->next == nullptr || prev->next->next == nullptr)
{
break;
}
//移动结点用于下次交换
cur = prev->next;
next = cur->next;
nnext = next->next;
}
return ret->next;
}
};
算法总结及流程解析:


结束语
到此,51.两数相加,52.两两交换链表中的节点 这两道算法题就讲解完了。**两数相加 通过模拟加法过程处理链表节点相加和进位问题;两两交换链表节点 采用迭代方法通过指针操作实现节点交换。**希望大家能有所收获!