题号:no14
题目名:链表求和
原题URL:https://leetcode-cn.com/problems/sum-lists-lcci/
题目描述
给定两个用链表表示的整数,每个节点包含一个数位。
这些数位是反向存放的,也就是个位排在链表首部。
编写函数对这两个整数求和,并用链表形式返回结果。
示例
示例 1:
输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295
输出:2 -> 1 -> 9,即912
进阶:思考一下,假设这些数位是正向存放的,又该如何解决呢?
示例 2:
输入:(6 -> 1 -> 7) + (2 -> 9 -> 5),即617 + 295
输出:9 -> 1 -> 2,即912
思路
只要按顺序,做好记录,注意进位问题就行。
解题代码
public class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//虚拟头结点
ListNode dummy = new ListNode(0);
//遍历节点
ListNode curr = dummy;
//两个链表的长度是不一定的,有可能一长一短
//标记,看看是不是需要进位
boolean isAdd1 = false;
//记录
while (l1 != null && l2 != null) {
int temp = l1.val + l2.val;
//如果有进位,那么将两个位置的和+1
if (isAdd1) {
temp++;
isAdd1 = false;
}
//如果大于10,进一位
if (temp >= 10) {
temp -= 10;
isAdd1 = true;
}
curr.next = new ListNode(temp);
curr = curr.next;
l1 = l1.next;
l2 = l2.next;
}
//如果还有剩余,则将第二次遍历节点指向剩余链表的开头
ListNode head2 = l1==null?l2:l1;
while (head2!=null) {
int val = head2.val;
if(isAdd1) {
val++;
isAdd1 = false;
}
if(val>=10) {
val-=10;
isAdd1 =true;
}
curr.next = new ListNode(val);
curr = curr.next;
head2 =head2.next;
}
if(isAdd1) curr.next=new ListNode(1);
return dummy.next;
}
}