一.链表常用的 [技巧] 和 [操作] 总结

        1.链表中的常用技巧:

        1.画图!!!

        画图无论是在链表中,在其它的算法中也具有很强的必要性,能让我们更直观地理解链表。

        2.引入虚拟"头结点"作为哨兵结点。

        这样的操作1.可以便于我们处理边界情况。2.方便我们对链表进行操作。

        3.不要吝啬空间,大胆定义变量。

        4.快慢双指针

        快慢双指针主要用于 1.判断链表有没有环形结构。2.寻找链表中环的入口。 3.找链表中倒数第 n 个结点 。

        2.链表中的常用操作:

        1.创建一个新结点 new:直接new新的结点就行,不必多说。

        2.尾插:

        3.头插:

把链表中的常见技巧和操作了解了之后,我们就要进入正式的学习链表算法之旅了~~~

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

        1.题目解析:

        2.算法原理:

        这道题的算法原理十分简单。解法:模拟两束相加的过程即可。

        不断重复上述操作我们就可以完成,直到链表结束。

        3.编写代码:

        这种类型的题目强烈推荐大家先去自己上手打一遍。

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        //创建两个指针用于遍历两个链表
        ListNode* cur1 = l1, *cur2 = l2;
        //new一个虚拟头节点/新链表,记录相加后的结果
        ListNode* newhead = new ListNode(0);
        //创建一个尾指针,指向最后一个结点
        ListNode* tail = newhead;
        //记录进位
        int t = 0;

        //只要cur1,cur2以及进位有一个不为0就进入循环
        while(cur1||cur2||t)
        {
            //先加上第一个链表
            if(cur1)
            {
                t += cur1->val;
                //加完之后指针后移一位
                cur1 = cur1->next;
            }
            //再加第二个链表
            if(cur2)
            {
                t += cur2->val;
                cur2 = cur2->next;
            }
            //将t的个位接入新链表中
            tail->next = new ListNode(t%10);
            tail = tail->next;
            t = t/10;
        }
        //由于newhead是我们new的虚拟结点,所以在结束后因该将其delete掉
        tail = newhead->next;
        delete newhead;
        return tail;
    }
};

 

 

更多推荐