Leetcode刷题链表之两数相加求和(java、python)

两数相加求和 1、问题描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
2、问题分析
对于这个问题,大家第一步想到的肯定是遍历链表,把整数取出来然后相加,再把和转换成链表。我最开始想到的一种方法是分别遍历链表,获取链表长度。假设长度为n,h1=v0x10^0 +… vnx10^n,同理求出第二个整数h2。然后还要把求到的结果返回到链表,这种方式显然太过麻烦。
其实,关于两个整数求和,如果把问题归到每个位上的数相加,只要判断是否进位就可以了。按照逻辑来说本来两个数相加应该向左进位,又因为该链表以逆序的方式存储它的位数,所以向右进位即可。
比如 2 4 3 + 5 6 4
2+5 =7 , 7<10(7/10=0),没有发生进位,直接相加即可,结果是7%10 为7
4+6 =10 ,10>=10(10/10=1) ,向右发生进位,保留进位后的数字,结果是10%10 为0
3+4+1=8, 8<10,由于上面发生进位所以这里加1 ,结果为8
3、代码
java

/** * Definition for singly-linked list. * public class ListNode { *int val; *ListNode next; *ListNode(int x) { val = x; } * } */ class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode head = new ListNode(0); //创建求和后的空链表 ListNode temp = head; //temp起到指针的作用,用来遍历链表 int flag = 0; //如果进位则为1,否则为0 while(l1 != null || l2 !=null || flag !=0){ int v1 = l1 != null?l1.val : 0; int v2 = l2 != null?l2.val : 0; int sum = v1+v2+flag; flag = sum/10; //判断是否发生进位ListNode sn = new ListNode(sum % 10); temp.next = sn; //把保存和值的节点赋值给空链表的下个节点 temp = sn; //指针指向所求链表的下一个链表 if(l1 != null) l1 = l1.next; //l1节点向右移动一位 if(l2 != null) l2 = l2.next; //l2节点向右移动一位} return head.next; //返回新链表表头 } }

【Leetcode刷题链表之两数相加求和(java、python)】python
# Definition for singly-linked list. # class ListNode: #def __init__(self, x): #self.val = x #self.next = Noneclass Solution: def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode: head = ListNode(0) temp = head flag = 0 while(l1 or l2 or flag!=0): if(l1) :v1=l1.val else :v1=0 if(l2) :v2=l2.val else :v2=0 sum = v1+v2+flag flag = sum//10//取整用// sn = ListNode(sum%10) temp.next = sn temp = sn if(l1!=None):l1=l1.next if(l2!=None):l2=l2.next return head.next

    推荐阅读