《算法题讲解指南:优选算法-链表》--51.两数相加,52.两两交换链表中的节点

🔥小叶-duck:个人主页

❄️个人专栏:《Data-Structure-Learning》

《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--优选算法

✨未择之路,不须回头
已择之路,纵是荆棘遍野,亦作花海遨游


目录

链表常用技巧以及操作总结:

51.两数相加

题目链接:

题目描述:

题目示例:

解法(模拟):

算法思路:

C++算法代码:

52.两两交换链表中的节点

题目链接:

题目描述:

题目示例:

解法(模拟):

算法思路:

C++算法代码:

算法总结及流程解析:

结束语


链表常用技巧以及操作总结:

51.两数相加

题目链接:

2. 两数相加 - 力扣(LeetCode)

题目描述:

题目示例:

解法(模拟):

算法思路:

两个链表都是逆序存储数字 的,即两个链表的个位数、十位数等都已经对应,可以直接相加 。

在相加过程中,我们要注意是否产生进位 ,产生进位时需要将进位和链表数字一同相加。如果产生进位的位置在链表尾部 ,即答案位数比原链表位数长一位 ,还需要再 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.两两交换链表中的节点

题目链接:

24. 两两交换链表中的节点 - 力扣(LeetCode)

题目描述:

题目示例:

解法(模拟):

算法思路:

只需要把题目示例画图画出来模拟交换过程即可,但必须要通过画图来进行理解操作过程!

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.两两交换链表中的节点 这两道算法题就讲解完了。**两数相加 通过模拟加法过程处理链表节点相加和进位问题;两两交换链表节点 采用迭代方法通过指针操作实现节点交换。**希望大家能有所收获!

相关推荐
w_zero_one2 小时前
递归算法(一)
java·开发语言·算法
风影同志783243 小时前
20 个比特能装下多少行情?——实测拆解 Kronos 的 K 线分词器
算法
写的都是BUG4 小时前
APK 里的钥匙,一直就放在门口:聊聊加固真正该做什么
前端·算法
地平线开发者4 小时前
CLIP 的零样本分类:一组文本如何变成图像分类器?
算法
京东云开发者5 小时前
从“会生成”到“能生产”:萤火虫 AIGC 平台的 AI Infra 实践
算法·aigc·产品
youshi66685 小时前
PID——算法改进
算法
一只不想敲代码的程序猿7 小时前
如何更高效地拆解问题?
算法
微尘hjx8 小时前
【Deep-OC-SORT 02】多轨迹算法Deep-OC-SORT-相对 OC-SORT 的改进点
人工智能·算法·yolo·目标跟踪·视觉检测·ultralytics·deep-oc-sort
梦帮科技8 小时前
意识启发式量子隧穿退火算法用于全局优化 (CITA) 完整技术指南
网络·人工智能·算法·量子计算·模拟退火算法
一去不复返的通信er9 小时前
排序 + 双指针:力扣15三数之和
算法·leetcode