我的思路是,先把每个链表组合成数字,然后把数字相加,这是函数GetNum做的事情。然后根据数字建个链表就行了。
关键就在于如何组合成数字,又如何把数字分解到链表上。
- 先获得非空链表的第一个值;如果链表的next不空,说明还有值,用while循环不断读取,用i记录位数,十位百位作为基数乘上位数。
- 分解操作,求每一位的数字,添加到一个列表中,新建一个链表,然后把表头给p,用for去遍历列表,不断新建链表给当前节点的next。
不过我的方法并不好。我后面附了好的办法。别人的方案。、
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = Nonedef getNum(l):num = l.vali = 1while(l.next != None):l = l.nextnum += 10**(i)*l.vali += 1return numdef bulidListNode(num):a = []while(num//10 != 0):print(num)a.append(num%10)num = (num - num%10) // 10a.append(num%10)ll = ListNode(a[0])p = llfor i in a[1:]:ll.next = ListNode(i)ll = ll.nextreturn pclass Solution:def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:num = getNum(l1) + getNum(l2)return bulidListNode(num)
别人的好方案
- 低位相加,用carry标记是否进位。
- 边加边建立新的节点。
#include <iostream>struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {}};
class Solution {
public:ListNode * addTwoNumbers(ListNode* l1, ListNode *l2) {ListNode* head = new ListNode(-1);ListNode* h = head;int sum = 0;bool carry = false; //进位while (l1 != NULL || l2 != NULL){sum = 0;if (l1 != NULL){sum += l1->val;l1 = l1->next;}if (l1 != NULL){sum += l2->val;l2 = l2->next;}if (carry)sum++;h->next = new ListNode(sum % 10);h = h->next;carry = sum > 10 ? true : false;}if (carry)h->next = new ListNode(1);return head->next;}
};