原题网址: http://www.lintcode.com/zh-cn/problem/add-two-numbers-ii/#
假定用一个链表表示两个数,其中每个节点仅包含一个数字。假设这两个数的数字顺序
排列,请设计一种方法将两个数相加,并将其结果表现为链表的形式。
您在真实的面试中是否遇到过这个题?
Yes
样例
给出 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 };
其他方法参考:
1 https://blog.csdn.net/sunday0904/article/details/72599054 栈的知识
2 https://blog.csdn.net/zhaohengchuan/article/details/78029642