Leetcode第二题(两数相加):
求两数之和:
传入两个链表,求其和并以链表返回
算法思路:
要点在于判断两个链表的长度问题和高位进位问题
首先遍历两个链表判断其长度谁大,然后将尾指针记录下来。然后同时遍历两个数组,进行数据求和,将得到数据放入较长的链表。
最后输出时考虑最高位进位,利用之前保存的尾指针在长链表末尾追加一个为值为一的节点。
代码
注意链表长度判断和进位问题。
/* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int sum = 0,jin = 0;
int len1 = 0 ,len2 = 0;
ListNode * ret1 = l1,* ret2 = l2; //用于返回链表
while(l1->next!=nullptr) //遍历两个链表求长度
{
l1=l1->next;
len1++;
}
while(l2->next!=nullptr)
{
l2=l2->next;
len2++;
}
ListNode * end1 = l1,* end2 = l2; //记录链表结尾
l1 = ret1; //指针回到头节点
l2=ret2;
bool FirstBigger = (len1>=len2); //判断两个链表大小,第一个大则FirstBigger = ture
while( l1 || l2 ) //主循环同时遍历两个链表
{
int n1 = l1 ? l1->val : 0; //l1不为空就取值,为空就取 0
int n2 = l2 ? l2->val : 0;
sum = n1 + n2 + jin; //记录和
if(FirstBigger) //第一个链表长就将值存在第一条链表
{
l1->val = sum%10;
}
else
{
l2->val = sum%10;
}
if(l1)
{
l1 = l1->next;
}
if(l2)
{
l2 = l2->next;
}
jin = sum/10; //取进位
}
if(jin) //有进位则返回时在尾部追加一个值为1的节点
{
if(FirstBigger)
{
l2 = new ListNode (1,nullptr); //用l2为了省空间
end1->next = l2;
return ret1;
}
else
{
l1 = new ListNode (1,nullptr);
end2->next = l1;
return ret2;
}
}
return (FirstBigger ? ret1 :ret2); //无进位直接返回较长的链表
}
};
TIPS:
可直接用链表指针判断链表是否为空
n1 = l1 ? l1->val : 0;三目运算符用于取值,补全短链表。