leetcode2題 題解 翻譯 C語言版 Python版


2. Add Two Numbers

You are given two linked lists representing two non-negative numbers. 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.

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8

2. 兩數相加

給你兩個鏈表表示兩個非負數。各位數字是以倒序方式存在每個結點上的,每個結點保存一個數字。把這兩個數相加並且以同樣的形式返回一個表示和的鏈表。


思路:

先構建一個空的頭結點不動,然后尾結點從頭結點開始向后不斷生成新的結點。遍歷兩條鏈公共部分,每次相加相應位數字和進位,分配到結果的鏈表中。公共部分遍歷完后再確定長的鏈表剩余的部分,同樣的方式遍歷完。

需要注意的是遍歷時每次都要更新進位,不斷計算和時有沒有發生進位,以防止舊數據污染。

對python來說需要新的變量作游標來遍歷兩鏈表,不能直接用形參,否則修改了原鏈表。

注意最后可能的進位。

對c語言來說最后要把分配的空的頭結點free掉,而python則不需要。


/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
struct ListNode *head = (struct ListNode*)malloc(sizeof(struct ListNode)), *tail = head; //空的頭結點
int carry = 0; //進位
for (; l1 && l2; l1 = l1->next, l2 = l2->next){ //處理兩條鏈公共長度部分
int sum = l1->val + l2->val + carry; //計算當前和
if (sum > 9){ //處理進位
sum -= 10;
carry = 1;
}
else{
carry = 0;
}
//分配結點
tail->next = (struct ListNode*)malloc(sizeof(struct ListNode));
tail = tail->next;
tail->val = sum;
}
//取兩條鏈長的那條剩下的部分
l1 = l1 ? l1 : l2;
//遍歷剩余部分
for( ; l1; l1 = l1->next){
//加上進位計算結點值
int sum = l1->val + carry;
if (sum > 9){
sum -= 10;
carry = 1;
}
else {
carry = 0;
}
//分配結點
tail->next = (struct ListNode*)malloc(sizeof(struct ListNode));
tail = tail->next;
tail->val = sum;
}
//如果最后還有進位,再分配一個結點
if (carry){
tail->next = (struct ListNode*)malloc(sizeof(struct ListNode));
tail = tail->next;
tail->val = 1; //加法的進位只可能是1
}
tail->next = NULL; //將鏈表收尾
//將空的頭結點釋放,從第二個結點返回
tail = head;
head = head->next;
free(tail);
return head;
}



# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None

class Solution(object):
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
head, p1, p2= ListNode(0), l1, l2 #空的頭結點
tail = head #尾結點
carry = 0; #進位
while p1 and p2: #遍歷兩條鏈公共部分
num = p1.val + p2.val + carry
if num > 9:
num -= 10
carry = 1
else:
carry = 0
# 添加結點
tail.next = ListNode(num)
tail = tail.next
# 移動兩條鏈
p1 = p1.next
p2 = p2.next
# 取兩條鏈長的那條剩下的部分
if p2: p1 = p2
while p1:
num = p1.val + carry
if (num > 9):
num -= 10
carry = 1
else:
carry = 0

tail.next = ListNode(num)
tail = tail.next

p1 = p1.next
# 如果最后還有進位,再分配一個結點
if carry:
tail.next = ListNode(1)
tail = tail.next
tail.next = None # 將鏈表收尾
return head.next #去掉空的頭結點






注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com