题意:给出两个链表,非负数字在链表中逆序存放,每个节点存放单个数字,将两个链表中的数字相加然后返回单链表
思路 :感觉就是链表的操作,注意进位,还有长度不一样的问题。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head = null, cur = head;
ListNode l1CurNode = l1, l2CurNode = l2;
boolean flag = false; //进位
while(l1CurNode != null && l2CurNode != null){ //不考虑改变原始输入的链表
int sum = l1CurNode.val + l2CurNode.val;
if(flag){
sum += 1; //优先处理上轮的进位,上一轮最多进位1
flag = false;
}
if(sum >= 10){
sum = sum % 10;
flag = true; //下一轮的进位
}
if(head == null){
head = new ListNode(sum);
cur = head;
}else{
cur.next = new ListNode(sum);
cur = cur.next; //新添加的节点
}
l1CurNode = l1CurNode.next;
l2CurNode = l2CurNode.next;
}
if(l1CurNode == null && l2CurNode == null){
if(flag){
cur.next = new ListNode(1);
}
}
if(l1CurNode != null){
subLink(l1CurNode, cur, flag); //修改连接关系
}
else{
subLink(l2CurNode, cur, flag);
}
return head;
}
private void subLink(ListNode l1CurNode, ListNode cur, boolean flag) {
while(l1CurNode != null){
int sum = l1CurNode.val;
if(!flag){
cur.next = l1CurNode;
return;
}
if(flag){
sum++;
if(sum >= 10){
sum = 0;
flag = true;
cur.next = new ListNode(sum);
cur = cur.next;
l1CurNode = l1CurNode.next;
}else{
flag = false;
cur.next = new ListNode(sum);
cur.next.next = l1CurNode.next;
return;
}
}
}
if(flag){
cur.next = new ListNode(1);
}
}
}