当前位置: 代码迷 >> 综合 >> LeetCode : 2.两数之和
  详细解决方案

LeetCode : 2.两数之和

热度:78   发布时间:2023-10-20 19:12:16.0

我的思路是,先把每个链表组合成数字,然后把数字相加,这是函数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;}
};