給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,而且它們的每一個節點只能存儲 一位 數字。若是,咱們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。java
You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.node
您能夠假設除了數字 0 以外,這兩個數都不會以 0 開頭。python
You may assume the two numbers do not contain any leading zero, except the number 0 itself.git
示例:指針
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 輸出:7 -> 0 -> 8 緣由:342 + 465 = 807
將兩個鏈表遍歷將相同位置節點值累加,其和過十進一,新鏈表相對位置節點值取其和的個位數值。須要考慮到兩個鏈表長度不一樣時遍歷方式、鏈表遍歷完成時最後一位是否須要進一位。code
class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode head = new ListNode(0);//虛擬頭節點 ListNode cur = head;//指針 int carry = 0;//進位值 while (l1 != null || l2 != null) {//兩個鏈表均爲空時中止遍歷 int x = (l1 != null) ? l1.val : 0;//x爲l1的值,若是節點爲空,值爲0 int y = (l2 != null) ? l2.val : 0;//y爲l2的值,若是節點爲空,值爲0 int sum = carry + x + y;//sum爲兩節點值之和 carry = sum / 10;//得進位值(1) cur.next = new ListNode(sum % 10);//sum%10 得餘數即 個位數的值 cur = cur.next;//刷新指針 if (l1 != null) l1 = l1.next;//l1節點不爲空繼續刷新下一個節點 if (l2 != null) l2 = l2.next;//l2節點不爲空繼續刷新下一個節點 } if (carry > 0) {//若是仍然須要進 1 ,則直接新建一個節點 cur.next = new ListNode(carry); } return head.next; } }
class Solution: def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode: head = ListNode(0) cur = head sum = 0 while l1 or l2: if l1:#l1不爲空 sum += l1.val#累計兩節點值的和 l1 = l1.next#刷新節點 if l2: sum += l2.val#累計兩節點值的和 l2 = l2.next#刷新節點 cur.next = ListNode(sum % 10)//刷新新鏈表 cur = cur.next sum = sum // 10 if sum != 0: cur.next = ListNode(sum) return head.next
歡迎關注公.衆號一塊兒刷題: 愛寫Bugit