• 《Cracking the Coding Interview》——第2章:链表——题目5


    2014-03-18 02:32

    题目:给定两个由单链表表示的数字,返回它们的和。比如(9->9) + (1->2) = 0->2->1,99 + 21 = 120。

    解法:逐位相加,注意处理进位、长度不等。

    代码:

      1 // 2.5 Given two numbers represented by two lists, write a function that returns sum list. The sum list is list representation of addition of two input numbers.
      2 // Example First List: 5->6->3 // represents number 365 
      3 // Second List: 8->4->2 // represents number 248 
      4 // Resultant list: 3->1->6 // 
      5 // Note :Any Carry forward should also be added as the new node . Any Comments on the code below
      6 #include <cstdio>
      7 using namespace std;
      8 
      9 struct ListNode {
     10     int val;
     11     ListNode *next;
     12     ListNode(int x): val(x), next(nullptr) {};
     13 };
     14 
     15 class Solution {
     16 public:
     17     ListNode* listAddition(ListNode *head1, ListNode *head2) {
     18         if (head1 == nullptr) {
     19             return head2;
     20         } else if (head2 == nullptr) {
     21             return head1;
     22         }
     23         
     24         int carry = 0;
     25         int val;
     26         ListNode *p1, *p2;
     27         ListNode *head, *tail;
     28         
     29         p1 = head1;
     30         p2 = head2;
     31         head = tail = nullptr;
     32         while (p1 != nullptr && p2 != nullptr) {
     33             val = p1->val + p2->val + carry;
     34             carry = val / 10;
     35             val %= 10;
     36             if (head == nullptr) {
     37                 head = tail = new ListNode(val);
     38             } else {
     39                 tail->next = new ListNode(val);
     40                 tail = tail->next;
     41             }
     42             p1 = p1->next;
     43             p2 = p2->next;
     44         }
     45         while (p1 != nullptr) {
     46             val = p1->val + carry;
     47             carry = val / 10;
     48             val %= 10;
     49             tail->next = new ListNode(val);
     50             tail = tail->next;
     51             p1 = p1->next;
     52         }
     53         while (p2 != nullptr) {
     54             val = p2->val + carry;
     55             carry = val / 10;
     56             val %= 10;
     57             tail->next = new ListNode(val);
     58             tail = tail->next;
     59             p2 = p2->next;
     60         }
     61         if (carry) {
     62             tail->next = new ListNode(carry);
     63             tail = tail->next;
     64         }
     65         
     66         return head;
     67     }
     68 };
     69 
     70 int main()
     71 {
     72     int i;
     73     int n1, n2;
     74     int val;
     75     struct ListNode *head, *head1, *head2, *ptr;
     76     Solution sol;
     77     
     78     while (scanf("%d%d", &n1, &n2) == 2 && n1 > 0 && n2 > 0) {
     79         // create two linked lists
     80         ptr = head1 = nullptr;
     81         for (i = 0; i < n1; ++i) {
     82             scanf("%d", &val);
     83             if (head1 == nullptr) {
     84                 head1 = ptr = new ListNode(val);
     85             } else {
     86                 ptr->next = new ListNode(val);
     87                 ptr = ptr->next;
     88             }
     89         }
     90         ptr = head2 = nullptr;
     91         for (i = 0; i < n2; ++i) {
     92             scanf("%d", &val);
     93             if (head2 == nullptr) {
     94                 head2 = ptr = new ListNode(val);
     95             } else {
     96                 ptr->next = new ListNode(val);
     97                 ptr = ptr->next;
     98             }
     99         }
    100         
    101         // add up the two lists
    102         head = sol.listAddition(head1, head2);
    103         
    104         // print the list
    105         printf("%d", head->val);
    106         ptr = head->next;
    107         while (ptr != nullptr) {
    108             printf("->%d", ptr->val);
    109             ptr = ptr->next;
    110         }
    111         printf("
    ");
    112         
    113         // delete the list
    114         while (head != nullptr) {
    115             ptr = head->next;
    116             delete head;
    117             head = ptr;
    118         }
    119         while (head1 != nullptr) {
    120             ptr = head1->next;
    121             delete head1;
    122             head1 = ptr;
    123         }
    124         while (head2 != nullptr) {
    125             ptr = head2->next;
    126             delete head2;
    127             head2 = ptr;
    128         }
    129     }
    130     
    131     return 0;
    132 }
  • 相关阅读:
    柔性数组
    2015阿里秋招当中一个算法题(经典)
    LAMP环境搭建
    JS和JQuery中的事件托付 学习笔记
    #17 Letter Combinations of a Phone Number
    码农生涯杂记_5
    【C++ Primer每日刷】之三 标准库 string 类型
    扎根本地连接未来 千米网的电商“红海”生存术
    poj 3356
    经验之谈—OAuth授权流程图
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3606692.html
Copyright © 2020-2023  润新知