题目:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
思路:从两个数据同时开始遍历,然后取出对应数据,如果取出的数据符合条件则开始对数据添加入新的链表
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
// 在链表的最后一位插上数据
ListNode* PushNodeData(ListNode* nodeSumData, int SumData){
// 为NULL的时候是开头,添加第一个数据
if(nodeSumData == NULL)
{
nodeSumData = new ListNode;
nodeSumData->val = SumData;
//printf(" nodeSumData->val = %d \n",nodeSumData->val);
return nodeSumData;
}
ListNode * temp = nodeSumData;
// 顺到链表的最后一位存在的实体
while(temp->next != NULL)
{
temp = temp->next;
}
// 开始插数据
ListNode * TempPushNode = new ListNode;
TempPushNode->val = SumData;
temp->next = TempPushNode;
//printf(" nodeSumData->val = %d \n",nodeSumData->val);
return nodeSumData;
}
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* nodeSumData = NULL;
int countTest = 1 ;
int pushData = 0 ;
int SumData = 0;
ListNode* LiData1 = l1 ;
ListNode* LiData2 = l2 ;
// 主循环中L1 L2两个数据开始执行遍历
while(countTest)
{
if(LiData1!=NULL){
SumData+= LiData1->val;
LiData1 = LiData1->next;
}
else{
LiData1=NULL;
}
if(LiData2!=NULL){
SumData+= LiData2->val;
LiData2 = LiData2->next;
}
else{
LiData2=NULL;
}
SumData += pushData;
if(SumData>=10)
{
SumData-=10;
pushData = 1;
}
else{
pushData = 0;
}
nodeSumData = PushNodeData(nodeSumData, SumData);
SumData = 0;
if((LiData1==NULL)&&(LiData2==NULL)&&(pushData==0))
{
break;
}
}
return nodeSumData;
}
};
后来看了下其他的分享完全没有必要写这个函数:PushNodeData
思路:就是一个循环搞定所有,用一个虚拟指针操作一切,然后返回头指针即可
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
if l1 == nil || l2 == nil {
return nil
}
// X,Y对应的是当前 L1、L2的值, carray对应的是进位之后的值
var x,y,carry int
head := &ListNode{Val:0 , Next: nil}
// temp就是上文提到的虚拟指针,主要用于链表操作
temp := head
// 从for开始对两个链表的数据进行取值
for l1 != nil || l2 != nil{
if l1 != nil{
x = l1.Val
}else{
x = 0
}
if l2 != nil{
y = l2.Val
}else{
y = 0
}
// 将新的数据添加进入节点
temp.Next = &ListNode{Val:(x+y+carry)%10 , Next:nil}
temp = temp.Next
carry = (x+y+carry)/10
if l1 != nil{
l1 = l1.Next
}
if l2 != nil{
l2 = l2.Next
}
}
// 最后两个链表之后,如果有进位则多添加一个节点
if carry>0{
temp.Next = &ListNode{Val:(x+y+carry)/10, Next:nil}
}
return head.Next
}
本文介绍了一种使用链表表示非负整数并实现加法运算的方法。通过遍历两个链表,逐位相加形成新的链表表示和,处理进位情况。提供了两种实现思路,一种是使用额外函数插入节点,另一种是简化版直接返回头节点。
1690

被折叠的 条评论
为什么被折叠?



