type
Post
status
Published
date
Mar 16, 2023
slug
summary
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
tags
c++
leetcode
category
算法
icon
password

两数之和

题解

链表中存储的数字是倒序的,但是计算的时候刚好可以按顺序将两个链表节点相加,保留进位,参与下一次的相加运算
核心是列表长度不同,要判断链表长度,但是可以采用下列方法解决,就是将两个列表都遍历完,短的链表当遍历到其为NULL时,使用零作为链表元素继续相加
class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode *p1=nullptr,*p2=nullptr; // t存储进位 int t=0; while(l1||l2){ // 省去判断两个链表长度,当短的链表遍历完,链表为空所以赋值为0,用0去计算 int x = l1!=nullptr?l1->val:0; int y = l2!=nullptr?l2->val:0; int sum = x+y+t; // p1作为新链表的第一个节点 if(!p1){ p1=p2=new ListNode(sum%10); } else{ p2->next=new ListNode(sum%10); p2=p2->next; } t=sum/10; if(l1) l1=l1->next; if(l2) l2=l2->next; } // 两个链表计算完毕,判断是否有进位 if(t>0){ p2->next=new ListNode(t); } return p1; } };
 
寻找两个正序数组的中位数两数之和