1.问题描述
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
来源:力扣(LeetCode)链接:https://leetcode.cn/problems/add-two-numbers
2.实列
3.解法
/*这里是定义一个链表的结点,注意定义一个链表的结点至少需要包含两个元素,一个是value,这个是数据空间,用来放需要存放的值;一个是next,这个是指针域,他表示用来指向下一个结点。这样我们才能穿起来成一个链表*/
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 head = null;
ListNode right = null;
int flag = 0;//设置一个标识为两个数的相加有进位的时候做准备。
while (l1 != null || l2 != null) {
//只要这两个链表不为空我就一直做加法运算
int num1 = l1 != null ? l1.val : 0;
int num2 = l2 != null ? l2.val : 0;
//这两步是为了防止一个链表有值,另外一个链表没有值的,确保加法可以正常执行
int sum = num1 + num2+flag;
flag=sum/10;
/*等价于
if(sum>=10)
flag=1;
else
flag=0;*/
if (head == null) {
//head头指针只用保存个位就行,最后返回head结点就行。
head = right = new ListNode(sum % 10);
} else {
right.next = new ListNode(sum % 10);
right = right.next;
}
if (l1 != null) {
l1 = l1.next;
//指向下一个结点
}
if (l2 != null) {
l2 = l2.next;
//指向下一个结点
}
}
if (flag>0){
//当两个链表最后两个数相加的时候产生了进位,那么就多一个结点保存,如例图中的样子
right.next=new ListNode(1);
}
return head;
}
}
l1和l2就是两个链表的头一个结点,也叫头指针。 其实这题只要能够理解链表,思路非常简单。就是把两个链表相同位数的值取出来相加,得到的值放到一个新的链表里面。只需要注意头指针head一定要是个位的就可以了