221 链表求和 II

原题网址: http://www.lintcode.com/zh-cn/problem/add-two-numbers-ii/#

假定用一个链表表示两个数,其中每个节点仅包含一个数字。假设这两个数的数字顺序排列,请设计一种方法将两个数相加,并将其结果表现为链表的形式。

样例

给出 6->1->7 + 2->9->5。即,617 + 295

返回 9->1->2。即,912 。

标签 
 
方法一:
设计一个寻找链表倒数第n个结点的函数,然后从两个链表的最后一个结点(整数的个位)开始,依次相加。
注意最后进位的判断,如果不为0,要再加一个节点。
 
  1 /**
  2  * Definition of singly-linked-list:
  3  * class ListNode {
  4  * public:
  5  *     int val;
  6  *     ListNode *next;
  7  *     ListNode(int val) {
  8  *        this->val = val;
  9  *        this->next = NULL;
 10  *     }
 11  * }
 12  */
 13 
 14 class Solution {
 15 public:
 16     /**
 17      * @param l1: The first list.
 18      * @param l2: The second list.
 19      * @return: the sum list of l1 and l2.
 20      */
 21     ListNode * addLists2(ListNode * l1, ListNode * l2) {
 22         // write your code here
 23         
 24         if (l1==NULL&&l2==NULL)
 25         {
 26             return NULL;
 27         }
 28         if (l1==NULL)
 29         {
 30             return l2;
 31         }
 32         if (l2==NULL)
 33         {
 34             return l1;
 35         }
 36         
 37         ListNode *temp1=findNthFromEnd(l1,1);
 38         ListNode *temp2=findNthFromEnd(l2,1);
 39         int i=1;
 40         int c=0;//进位;
 41 
 42         ListNode * tailNode = NULL;
 43         
 44         while(temp1!=NULL&&temp2!=NULL)
 45         {
 46             int tempsum=temp1->val+temp2->val+c;
 47             c=tempsum/10;
 48             tempsum=tempsum%10;
 49             //创建新节点,并向前插入链表;
 50             ListNode * newNode=new ListNode(tempsum); 
 51             newNode->next=tailNode;
 52             tailNode=newNode;
 53             
 54             ++i;
 55             temp1=findNthFromEnd(l1,i);
 56             temp2=findNthFromEnd(l2,i);
 57         }
 58 
 59         while (temp1!=NULL)
 60         {
 61             
 62             int tempsum=temp1->val+c;
 63             c=tempsum/10;
 64             tempsum=tempsum%10;
 65             //创建新节点,并向前插入链表;
 66             ListNode * newNode=new ListNode(tempsum); 
 67             newNode->next=tailNode;
 68             tailNode=newNode;
 69             
 70             ++i;
 71             temp1=findNthFromEnd(l1,i);
 72         }
 73         while (temp2!=NULL)
 74         {
 75             
 76             int tempsum=temp2->val+c;
 77             c=tempsum/10;
 78             tempsum=tempsum%10;
 79             //创建新节点,并向前插入链表;
 80             ListNode * newNode=new ListNode(tempsum); 
 81             newNode->next=tailNode;
 82             tailNode=newNode;
 83 
 84             ++i;
 85             temp2=findNthFromEnd(l2,i);
 86             
 87         }
 88         
 89         if (c!=0)
 90         {
 91             ListNode * newNode=new ListNode(c); 
 92             newNode->next=tailNode;
 93             tailNode=newNode;
 94         }
 95         return tailNode;
 96     
 97         
 98     }
 99     
100     
101     //找到倒数第n个结点;
102     ListNode * findNthFromEnd(ListNode * head, int n) 
103     {
104         if (n==0||head==NULL)
105         {
106             return head;
107         }
108 
109         ListNode *temp=head;
110         int total=1;
111         while(temp->next != NULL) 
112         {
113             total++;
114             temp=temp->next;
115         }
116 
117         //n超出范围记得返回NULL,否则造成addList2的死循环(temp1和temp2永远为head结点),泪;
118         if (n>total)
119         {
120             return NULL;
121         }
122 
123         int index=total-n+1;
124         ListNode *curNode=head;
125         for(int i=1;i<index;i++) //循环结束时curNode为第index个结点;
126         {
127             curNode=curNode->next;
128         }
129         
130         return curNode;
131     }
132 };

 

其他方法参考:

https://blog.csdn.net/sunday0904/article/details/72599054  栈的知识

https://blog.csdn.net/zhaohengchuan/article/details/78029642

posted @ 2018-03-29 15:08  eeeeeeee鹅  阅读(250)  评论(0编辑  收藏  举报