【程序员面试金典】面试题 02.05. 链表求和

【程序员面试金典】面试题 02.05. 链表求和

    • 题目描述
    • 解题思路

题目描述

描述:给定两个用链表表示的整数,每个节点包含一个数位。

这些数位是反向存放的,也就是个位排在链表首部。

编写函数对这两个整数求和,并用链表形式返回结果。

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

进阶:思考一下,假设这些数位是正向存放的,又该如何解决呢?

解题思路

思路1:最直观的想法是,使用p表示链表1,使用q表示链表2,使用sum表示当前和,使用cur表示当前位,使用add表示进位,使用L存储求和数。首先同时遍历两个链表,对其求和,并创建结点temp存储cur,然后插入到L后面,再将p和q均向后移;接着如果p不为空则遍历p,q不为空则遍历q;最后一定要对add再进行一个判断,因为5和5相加等于10,如果不判断的话结果就是0了。

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) 
{
    int sum; //求和
    int cur; //当前位
    int add=0; //进位
    ListNode*p=l1;
    ListNode*q=l2;
    //求和节点
    ListNode *L=new ListNode(0);
    L->next=NULL;
    ListNode *s=L;
    // 共同位
    while(p&&q)
    {
       sum=p->val+q->val+add;
       cur=sum%10;
       add=sum/10;
       ListNode* temp=new ListNode(cur);
       s->next=temp;
       s=s->next;
       p=p->next;
       q=q->next;
    }
    //剩下p不空
    while(p)
    {
       sum=p->val+add;
       cur=sum%10;
       add=sum/10;
       ListNode* temp=new ListNode(cur);
       s->next=temp;
       s=s->next;
       p=p->next;
    }
    //剩下q不空
    while(q)
    {
       sum=q->val+add;
       cur=sum%10;
       add=sum/10;
       ListNode* temp=new ListNode(cur);
       s->next=temp;
       s=s->next;
       q=q->next;
    }
    //最后还需要对add进行判断一下  5 5 10
    if(add!=0)
    {
        ListNode* temp=new ListNode(add);
        s->next=temp;
        s=s->next;
    }
    s->next=NULL;
    return L->next;
}

总结:如果链表正序存储又该怎么办呢?

你可能感兴趣的:(程序员面试金典,链表,面试)