思路:反转链表再求和
需要注意
- 因为求和后要创建一个新链表,但是我们是先得出的个位数,所以应该用头插法插入,这样最先出现的个位数可以在最后的时候跑到最后面(使用哨兵结点可以简化操作)
- 在while循环退出后,记得判断一次flag的大小
class Solution {
//返回反转后链表的头结点
ListNode reverseList(ListNode head) {
ListNode pre = null, now = head;
while (null != now) {
ListNode next = now.next;
now.next = pre;
pre = now;
now = next;
}
return pre;
}
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode reverseL1 = reverseList(l1), reverseL2 = reverseList(l2);
ListNode dummy = new ListNode(0, null);
int flag = 0;
while (null != reverseL1 || null != reverseL2) {
int val = flag + (null != reverseL1 ? null != reverseL2 ? reverseL1.val + reverseL2.val: reverseL1.val : reverseL2.val);
ListNode node = new ListNode(val % 10, dummy.next);
dummy.next = node;
flag = val / 10;
if(null != reverseL1)
reverseL1 = reverseL1.next;
if(null != reverseL2)
reverseL2 = reverseL2.next;
}
if(0 != flag)
dummy.next = new ListNode(flag,dummy.next);
return dummy.next;
}
}
Go代码
func reverseList(head *ListNode) *ListNode {
if nil == head || nil == head.Next {
return head
}
var pre *ListNode
now := head
for now != nil {
next := now.Next
now.Next = pre
pre = now
now = next
}
return pre
}
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
l1, l2 = reverseList(l1), reverseList(l2)
head := &ListNode{}
flag := 0
for l1 != nil || l2 != nil {
val := flag
if l1 != nil {
val += l1.Val
l1 = l1.Next
}
if l2 != nil {
val += l2.Val
l2 = l2.Next
}
if val >= 10 {
flag = 1
val -= 10
} else {
flag = 0
}
head.Next = &ListNode{
Val: val,
Next: head.Next,
}
}
if flag > 0 {
head.Next = &ListNode{
Val: flag,
Next: head.Next,
}
}
return head.Next
}