1. 两数相加问题
给定两个链表,分别表示两个非负整数。他们的数字逆序存储在链表中,且每个节点只存储一个数字,计算两个数的和,并且返回和的链表头指针。
如:输入:2->4->3 , 5->6->4, 输出:7->0->8.
分析:因为两个数都是逆序存储的,因此可以从头往后加,而且每个节点存储的都是个位数,因此相加不会超过18。模拟两个数按位相加的过程就可以了。用一个额外的变量记录当前位相加是否有进位。
注意:
- 当两个链表长度不相等时该怎么处理?
- 最后一位是否有进位?
/** * 该算法计算两个逆序放置的链表的和,返回和的头指针 * 如:输入:2->4->3 , 5->6->4, 输出:7->0->8. * @param l1 * @param l2 * @return */ public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode h = new ListNode(-1); ListNode res = h; int flag = 0; ListNode p = l1, q = l2; while( p != null && q != null) { int temp = p.val + q.val; if(flag == 1) temp++; flag = temp / 10; temp %= 10; ListNode node = new ListNode(temp); res.next = node; res = res.next; p = p.next; q = q.next; } while(p != null) { int temp = p.val; if(flag == 1) temp++; flag = temp / 10; temp %= 10; ListNode node = new ListNode(temp); res.next = node; res = res.next; p = p.next; } while(q != null) { int temp = q.val; if(flag == 1) temp++; flag = temp / 10; temp %= 10; ListNode node = new ListNode(temp); res.next = node; res = res.next; q = q.next; } if(flag == 1) { ListNode node = new ListNode(1); res.next = node; } return h.next; }