1. 题⽬链接:2.两数相加
2. 题⽬描述:
3. 解法(模拟):
算法思路:
两个链表都是逆序存储数字的,即两个链表的个位数、⼗位数等都已经对应,可以直接相加。
在相加过程中,我们要注意是否产⽣进位,产⽣进位时需要将进位和链表数字⼀同相加。如果产⽣进 位的位置在链表尾部,即答案位数⽐原链表位数⻓⼀位,还需要再new ⼀个结点储存最⾼位。
C++算法代码:
/**
* 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)
{
ListNode* cur1=l1;
ListNode* cur2=l2;
ListNode* xn_head= new ListNode(0); //虚拟头结点
ListNode* temp=xn_head;
int t=0;
//模拟加法
while(cur1||cur2||t)
{
if(cur1)
{
t+=cur1->val;
cur1=cur1->next;
}
if(cur2)
{
t+=cur2->val;
cur2=cur2->next;
}
temp->next=new ListNode(t%10);
temp=temp->next;
t/=10;
}
//释放虚拟头结点
temp=xn_head->next;
delete(xn_head);
return temp;
}
};
Java算法代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution
{
public ListNode addTwoNumbers(ListNode l1, ListNode l2)
{
ListNode cur1 = l1, cur2 = l2;
ListNode newHead = new ListNode(0); // 创建⼀个虚拟头结点,⽅便记录结果
ListNode prev = newHead; // 尾插操作的尾指针
int t = 0; // 记录进位
while (cur1 != null || cur2 != null || t != 0)
{
// 先加上第⼀个链表
if (cur1 != null)
{
t += cur1.val;
cur1 = cur1.next;
}
// 加上第⼆个链表
if (cur2 != null)
{
t += cur2.val;
cur2 = cur2.next;
}
prev.next = new ListNode(t % 10);
prev = prev.next;
t /= 10;
}
return newHead.next;
}
}