LC445-两数相加-链表/栈/头插法

本文介绍了一种解决链表加法的方法,通过使用栈来逆序处理链表中的数位,实现两个链表所表示的非负整数相加,并返回新的链表结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表

输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 8 -> 0 -> 7
难点

本题的主要难点在于链表中数位的顺序与我们做加法的顺序是相反的,为了逆序处理所有数位,我们可以使用:把所有数字压入栈中,再依次取出相加。
最后使用头插法记录每一位的val,返回此链表
Add a node at the front

头插法的主要步骤:
  1. 给要插入的节点赋值
ListNode curNode = new ListNode(cur);
  1. 将要插入的节点的指针域指向 即将要插入的链表的头节点(ans)
curNode.next = ans;
  1. 更新头节点,插入之后的头节点为新插入的这个节点
ans = curNode;
代码
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //2个链表2个栈
        Stack<Integer> stack1 = new Stack<>();
        Stack<Integer> stack2 = new Stack<>();

        while(l1 != null){
            stack1.push(l1.val);
            l1 = l1.next;
        }
        while(l2 != null){
            stack2.push(l2.val);
            l2 = l2.next;
        }

        int carry = 0;
        //ListNode dummy = new ListNode(0);
        ListNode ans = null;
        //dummy.next = ans;

        while(!stack1.isEmpty() || !stack2.isEmpty() || carry > 0){
            int a = stack1.isEmpty() ? 0 : stack1.pop();
            int b = stack2.isEmpty() ? 0 : stack2.pop();
            int cur = a + b + carry;
            carry = cur/10;//取整
            cur %= 10;//取余
            ListNode curNode = new ListNode(cur);
            curNode.next = ans;
            //dummy.next = curNode;
            ans = curNode;
        }
        return ans;
    }
}
### 使用头插法创建链表 在使用头插法创建链表时,每次新入的节点都会成为新的头部节点。这种方的特点是在构建过程中不断改变链表的第一个节点,使得最终形成的链表元素顺序与输入相反。 以下是具体的实现方式: #### 头插法创建链表的C++代码示例 ```cpp #include <iostream> using namespace std; // 定义链表节点结构体 struct LNode { char data; LNode *next; }; typedef LNode* LinkList; // 初始化空链表 void InitLinkList(LinkList &L) { L = new LNode(); L->next = nullptr; } // 头插法创建链表 void CreateLinkListHead(LinkList &L, int n) { cout << "请输入要入的数据:" << endl; for (int i = 0; i < n; ++i) { char ch; cin >> ch; // 新建节点 LNode *newNode = new LNode(); newNode->data = ch; // 入操作 newNode->next = L->next; L->next = newNode; } } // 输出链表 void DispLinkList(LinkList L) { LNode *p = L->next; while(p != nullptr){ cout << p->data << ' '; p = p->next; } cout << endl; } ``` 上述代码展示了如何利用头插法来创建一个简单的字符型单向链表[^1]。每当有一个新的数据被读取进来之后就会立即作为最新的头结点加入到现有的链表之前,从而实现了反序的效果。 为了验证这段程序的功能,可以通过如下测试案例来进行检验:先初始化一条空链表`InitLinkList(L)`,接着调用`CreateLinkListHead(L, num)`函数按照指定数量`num`依次添加若干个字符至该链表之中,最后打印整个链表的内容查看是否按预期工作正常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值