タイトル説明
二つの非空リストを与えは、二つの非負整数を表すために使用されます。ここで、それぞれのビットは、方法の逆の順序で格納され、それらは各ノードが一つだけ桁を格納することができます。
我々はこれらの2つの数値を合計した場合、それは新しいリストを返しますし、それらを表現します。
あなたは数字0に加えて、これらの二つの数字が0で始まっていないと仮定することができます。
例:
入力:(2 - > 4 - > 3)+(5 - > 6 - > 4)
出力:7 - > 0 - > 8
原因:342 + 465 = 807
私はなって、このトピックのバーは、ユーザーが86.79パーセントを破っ実行することを拒否することは非常に良い時間を書き込むことができ、再帰的ではなく、ジャンクのメモリ消費量
問題解決のためのアイデア
この質問は、私は良いアイデアの様々なを使用し、テストしたすべての前のいくつかは、様々な問題を提出します。コードアイデア以下は同一の鎖長がmaxresにある場合(長い方を決定するために、誰空でないと出てきた、次いで(A + = B、B + = A)を添加し、ショート長い分割することなく、最初のリストAとリストBであります最長鎖L1)である。最も長い鎖は、その後)(maxres決定され、以下のようにヴァルの値が、ゼロよりも大きいです。
(プラスの可能なクロスが長い人短い、偉大なメモリ消費AとBリストを区別しない前に、だけでなく、そこに2の合計を横断するリストなしので、間に区別はありません、また、時間を実行する必要がなくなるため)
注:各ノードは、単一の桁であるので、1の最大値を運びます
コード
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* p1=l1;
ListNode* p2=l2;
ListNode* maxres=NULL;
ListNode* tmp=NULL;
ListNode* res=NULL;
while(p1!=NULL&&p2!=NULL){ //循环互加,直至一方为空
int temp;
temp=p1->val;
p1->val+=p2->val;
p2->val+=temp;
p1=p1->next;
p2=p2->next;
}
if(p1==NULL&&p2!=NULL)//说明l2(p2)长
maxres=l2;
else //此处是两种情况让其都把l1作为长链表(1:链表l1长;2:链表l1和l2一样长)
maxres=l1;
ListNode* result=maxres;
int fly=0;
while(maxres!=NULL){//进行检查每个节点的值是否大于10,是否要进位操作。
maxres->val+=fly;
if(maxres->val>=10){ //当最后一个节点大于10的时候,fly也等于1;
fly=1;
maxres->val=maxres->val%10;
}
else{
fly=0;
}
tmp=maxres;
maxres=maxres->next;
}
if(fly==1){ //最后一个节点大于10,因此需要给链表结尾插入节点进位。
ListNode* node=new ListNode(NULL);
node->next=NULL;
node->val=1;
tmp->next=node;
}
return result;
}
};