这里麻烦的在于两个情况
- 需要考虑进位的问题
- 每位数字是链表形式存储的,而且是逆序,这对想要从地位向高位相加,以及进位带来了麻烦
最直接的做法是把各位数字取出来处理后再构造一个新链表,但这肯定不是题目期望的
那么考虑在一条链表上原地操作
逆向的好处是已经从低位对齐了
那么我需不需要知道“哪一条链表更长呢?”是否是必要的?如果在其中一条链表上原地操作的话,就需要知道哪条链表更长
瞄一眼题解确实是构造了一条新的链表,它修改了原指针,并且创建了两个新指针
head指针用于保存新的头节点,因为生成的链表是逆序的,所以需要
cur指针用于生成遍历,用于确定新建的节点的插入位置
而至于两条链表不一样长的问题,对于短链表一定会出现空指针的情况
这里的处理方式是,首先把空指针的val看作是0
另外遇到空指针,指针就不再向下移动,避免发生空指针异常
另外这里的进位,稍加思考就可以确定进位不会超过1,所以这里直接用一个bool值来表示是否进位
但其实没必要bool,让进位也是int参与计算写出来会更简洁,然后也可以当bool用
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int flag=0;
ListNode* ptr1 = l1, * ptr2 = l2;// 这里我还是打算不修改原指针
ListNode* head =nullptr, *cur = nullptr;
while (ptr1 || ptr2) {
// 注意这里的写法很有意思
int val1 = ptr1 ? ptr1->val : 0;
int val2 = ptr2 ? ptr2->val : 0;
int sum = val1 + val2 + flag;
flag = sum / 10;// 更新进位
if (flag) sum %= 10;// 如果有进位就更新sum
// 开始追加新节点
if (!head) // 第一次初始化
head = cur = new ListNode(sum);
else {
cur->next = new ListNode(sum);
cur = cur->next;
}
// 更新两个链表的遍历指针
if (ptr1) ptr1 = ptr1->next;
if (ptr2) ptr2 = ptr2->next;
}
// 最后一步是,如果较长的链表遍历完了,还有一个进位
if (flag) cur->next = new ListNode(flag);
return head;
}
标签:链表,ListNode,cur,相加,ptr2,力扣,进位,两数,指针
From: https://www.cnblogs.com/yaocy/p/16825181.html