Leedcode 链表两数相加 .02

本文介绍了一种使用链表表示非负整数并实现加法运算的方法。通过遍历两个链表,逐位相加形成新的链表表示和,处理进位情况。提供了两种实现思路,一种是使用额外函数插入节点,另一种是简化版直接返回头节点。

题目:

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 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
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值