这是一道关于单向链表的题目,考察的也就是单向链表的构建和遍历。题目如下:
单链表的遍历以普通的加法为载体呈现,题意很好理解。
我写了两个版本的代码,一个是开启了一个新的链表来存储结果,一个是就地加到较长的链表上去。从思路上不难看出,前者更省时间(因为不需要额外判断链表长短,直接随加随开新的节点),后者更省空间。
这里给出第二种解法的代码:
1.首先我们需要写一个函数来得到链表L1和L2的长度,代码如下:
// get the length of linked list
int getListLength(ListNode* List)
{
int Length = 0;
ListNode* MeasurePtr = List;
while(MeasurePtr != nullptr)
{
++Length;
MeasurePtr = MeasurePtr->next;
}
return Length;
}
2.这部分就是AC的核心代码,其中返回的结果当然是存储最终结果的较长的链表Longer,较短的链表作为加数来和较长链表中的元素值一一相加。另外开了两个指针,一前(Lead)一后(Follow)的对较长的链表进行遍历。这样做是因为如果靠前的指针已经指向了最后一个链表节点而跳出循环,而此时还有进位没有处理,这时候就需要跟在其后的Follow指针来申请一个新的链表节点来存储最高位的进位,这就是如下代码的含义:
// if there is a remained carry bit
if(Carry)
Follow->next = new ListNode(Carry);
以下是完整代码
// in-place calculation
ListNode* Longer = getListLength(l1) >= getListLength(l2) ? l1 : l2;
ListNode* Shorter = Longer == l1 ? l2 : l1;
ListNode* Lead = Longer;
ListNode* Follow;
// carry bit
int Carry = 0;
while(Lead != nullptr)
{
// add the shorter list's value
if(Shorter != nullptr)
Lead->val += Shorter->val;
// add the carry bit
Lead->val += Carry;
// if the Result > 10
if(Lead->val >= 10)
{
Lead->val %= 10;
Carry = 1;
}
else
Carry = 0;
// modify pointers
Follow = Lead;
Lead = Lead->next;
if(Shorter != nullptr)
Shorter = Shorter->next;
}
// if there is a remained carry bit
if(Carry)
Follow->next = new ListNode(Carry);
return Longer;