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

相关推荐
Cosolar1 小时前
阿里CoPaw进阶使用手册:从新手到高手的完整指南
人工智能·后端·算法
代码改善世界1 小时前
【数据结构】八大排序算法详解(C语言实现)|插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序、计数排序
c语言·数据结构·排序算法
松小白song1 小时前
机器人路径规划算法之Dijkstra算法详解+MATLAB代码实现
前端·javascript·算法
qq_263_tohua1 小时前
第107期 刷算法题
算法
2501_940315261 小时前
98验证二叉搜索树
java·数据结构·算法
luckycoding2 小时前
3005. 最大频率元素计数
算法·leetcode·职场和发展
像污秽一样2 小时前
算法设计与分析-算法效率分析基础-分治法
算法·排序算法
我能坚持多久2 小时前
栈与队列OJ问题详解
算法
fengxin_rou2 小时前
一文读懂 Redis 集群:从哈希槽到透明访问
java·数据库·redis·算法·spring·缓存