分析:要对不同长度或者相同长度的链表进行相加,要面对的第一个问题就是进位问题的考虑,进位该如何处理是比较麻烦的点。比如999+1 = 1000,千位数上的1该如何处理;第二个问题就是链表长度的计算,这点我觉得已经做过太多次了,写一个函数就可以。
遍历链表时,我们有两种遍历方法,第一种是两个链表一起遍历,当其中一个链表遍历完后退出循环,再次判断另外一个链表是否已经到达链表的尾部,如果没有,还需要继续遍历没遍历完的链表;第二种遍历方法是,先遍历短的链表,当短的链表遍历完后,再遍历长的链表;注意,再遍历长的链表时,需要设置一个指针跟踪指针的位置,这样做是为了处理上面说的999+1 = 1000这种情况。
具体代码如下:
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
//题目说明了最少为一个节点,所以不用考虑链表为空的情况
int len1 = getleng(l1);
int len2 = getleng(l2);
ListNode*L1 = len1>=len2?l1:l2;
ListNode*S1 = l1 == L1?l2:l1;
ListNode*CURL = L1 ;
ListNode*CURS = S1 ;
//进位信息
int Num = 0,carry = 0;
//用来跟踪长链表
ListNode* last = nullptr;
//先遍历短链表
while(CURS!=nullptr)
{
Num = CURL->val+CURS->val+carry;
CURL->val = Num%10;
carry = Num/10;
last = CURL;
CURL = CURL->next;
CURS = CURS->next;
}
//遍历长的,此时短的已经遍历完了
while(CURL!=nullptr)
{
Num = CURL->val+carry;
CURL->val = Num%10;
carry = Num/10;
last = CURL;
CURL = CURL->next;
}
//如果遍历完长的链表以后,还有进位信息,也就是carry==1;
if(carry!=0)
{
last->next = new ListNode(1);
}
return L1;
}
//获取链表长度
int getleng(ListNode *head)
{
int len=0;
ListNode *cur = head;
while(cur!=nullptr)
{
len++;
cur = cur->next;
}
return len;
}
};
执行结果:
每次的用时会稍有不同,不用太在意。