zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    JStack分析cpu消耗过高问题
    Machine Learning in Action – PCA和SVD
    Machine Learning in Action -- FP-growth
    Machine Learning in Action -- 树回归
    Machine Learning in Action -- 回归
    Kafka 0.8 配置参数解析
    统计学习方法笔记 -- 隐马尔可夫模型
    Machine Learning in Action -- AdaBoost
    统计学习方法笔记 -- Boosting方法
    Andrew Ng机器学习公开课笔记–Reinforcement Learning and Control
  • 原文地址:https://www.cnblogs.com/Tang-tangt/p/8669926.html
Copyright © 2011-2022 走看看