首页 > 代码库 > careercup-链表 2.5

careercup-链表 2.5

2.5 给定两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。

示例:

输入: (7->1->6)+(5->9->2),即617+295.

输出:2->1->9,即912.

进阶:

假设这些数位是正向存放的

示例:

输入:(6->1->7)+(2->9->5),即617+295.

输出:9->1->2,即912.

逆向存放时,C++实现:

#include<iostream>#include<new>using namespace std;struct ListNode{    int val;    ListNode *next;    ListNode(int x):val(x),next(NULL) {}};void createList(ListNode *&L,int arr[],int n){    int i;    ListNode *p=NULL;    for(i=0; i<n; i++)    {        ListNode *tmp=new ListNode(arr[i]);        if(L==NULL)        {            L=tmp;            p=tmp;        }        else        {            p->next=tmp;            p=tmp;        }    }}ListNode *merge(ListNode *L1,ListNode *L2){    if(L1==NULL&&L2==NULL)        return NULL;    if(L1==NULL||L2==NULL)        return L1!=NULL?L1:L2;    ListNode *p=L1;    ListNode *pre=L1;    ListNode *q=L2;    int carry=0;    while(p&&q)    {        int sum=p->val+q->val+carry;        p->val=sum%10;        carry=sum/10;        pre=p;        p=p->next;        q=q->next;    }    while(p)    {        int sum=p->val+carry;        cout<<sum<<endl;        p->val=sum%10;        carry=sum/10;        pre=p;        p=p->next;    }    ListNode *tmp=NULL;    while(q)    {        int sum=q->val+carry;        tmp=new ListNode(sum%10);        carry=sum/10;        pre->next=tmp;        pre=tmp;        q=q->next;    }    if(carry==1)    {        tmp=new ListNode(carry);        pre->next=tmp;    }    return L1;}int main(){    ListNode *L1=NULL;    ListNode *L2=NULL;    int arr1[3]={7,1,9};    int arr2[5]={5,9};    createList(L1,arr1,3);    createList(L2,arr2,2);    ListNode *head=merge(L1,L2);    ListNode *p=head;    while(p)    {        cout<<p->val<<" ";        p=p->next;    }    cout<<endl;}

正向存放时,可以先利用头插入将两个链表逆转,然后按照上面的过程求和。

 

careercup-链表 2.5