码迷,mamicode.com
首页 > 其他好文 > 详细

链表操作 -- 模拟问题

时间:2014-11-27 16:10:44      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:style   blog   ar   color   使用   sp   on   div   问题   

问题:

        两个链表模拟大整数加法。

 

解答:

  1)使用递归实现。

  比直接使用迭代实现更好。

  加法需要从最低位开始,在使用递归实现时,会先递归到最底层(len==1)的情况,然后依次返回到上一层并伴随返回进位数。这样就比直接的迭代实现节省了每次定位同层节点的时间。

 1 int length(const Node* head)
 2 {
 3     int length = 0;
 4     while(head != NULL)
 5     {
 6         length++;
 7         head = head->next;
 8     }
 9 
10     return length;
11 }
12 
13 //headA指的链表长度不小于headB
14 int __add(Node* headA, int lenA, Node* headB, int lenB)
15 {
16     int sum = -1;
17     if(lenA == 1)
18         sum = headA->data + headB->data;
19     else if(lenA > lenB)
20         sum = headA->data + __add(headA->next, --lenA, headB, lenB);
21     else//现在只剩下lenA == lenA的情况
22         sum = headA->data + headB->data + __add(headA->next, --lenA, headB->next, --lenB);
23 
24     headA->data = sum % 10;
25     return sum / 10;
26 }
27 
28 Node* add(Node* listA,Node* listB)
29 {
30     if(listA == NULL)
31         return listB;
32     if(listB == NULL)
33         return listA;
34 
35     int lenA = length(listA);
36     int lenB = length(listB);
37     Node* longer = listA;
38     Node* shorter = listB;
39     if(lenA <lenB)
40     {
41         longer = listB;
42         shorter = listA;
43     }
44 
45     int carry = __add(longer, lenA, shorter, lenB);
46     if(carry != 0)
47     {
48         Node* head = new Node(carry);
49         head->next = longer;
50         longer = head;
51     }
52 
53     return longer;
54 }

  

  2)迭代实现

  

    直接的迭代实现较为浪费时间,在由尾向头坐加法时,每次需要遍历过程来获取某一个位置的节点,花费O(n)的时间;

 

    可以使用堆栈,讲两个链表的同层节点压入依次压入堆栈。然后再依次弹出、计算。这个过程其实就和函数递归调用一样的了。在此不表。

 

链表操作 -- 模拟问题

标签:style   blog   ar   color   使用   sp   on   div   问题   

原文地址:http://www.cnblogs.com/carlsama/p/4126470.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!