首页 > 其他分享 >力扣-2-两数相加

力扣-2-两数相加

时间:2022-10-25 16:56:55浏览次数:45  
标签:链表 ListNode cur 相加 ptr2 力扣 进位 两数 指针

这里麻烦的在于两个情况

  1. 需要考虑进位的问题
  2. 每位数字是链表形式存储的,而且是逆序,这对想要从地位向高位相加,以及进位带来了麻烦

最直接的做法是把各位数字取出来处理后再构造一个新链表,但这肯定不是题目期望的
那么考虑在一条链表上原地操作
逆向的好处是已经从低位对齐了

那么我需不需要知道“哪一条链表更长呢?”是否是必要的?如果在其中一条链表上原地操作的话,就需要知道哪条链表更长

瞄一眼题解确实是构造了一条新的链表,它修改了原指针,并且创建了两个新指针
head指针用于保存新的头节点,因为生成的链表是逆序的,所以需要
cur指针用于生成遍历,用于确定新建的节点的插入位置

而至于两条链表不一样长的问题,对于短链表一定会出现空指针的情况
这里的处理方式是,首先把空指针的val看作是0
另外遇到空指针,指针就不再向下移动,避免发生空指针异常

另外这里的进位,稍加思考就可以确定进位不会超过1,所以这里直接用一个bool值来表示是否进位
但其实没必要bool,让进位也是int参与计算写出来会更简洁,然后也可以当bool用

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
	int flag=0;
	
	ListNode* ptr1 = l1, * ptr2 = l2;// 这里我还是打算不修改原指针
	ListNode* head =nullptr, *cur = nullptr;
	
	while (ptr1 || ptr2) {
		// 注意这里的写法很有意思
		int val1 = ptr1 ? ptr1->val : 0;
		int val2 = ptr2 ? ptr2->val : 0;
		int sum = val1 + val2 + flag;
		flag = sum / 10;// 更新进位
		if (flag) sum %= 10;// 如果有进位就更新sum
		// 开始追加新节点
		if (!head) // 第一次初始化
			head = cur = new ListNode(sum);
		else {
			cur->next = new ListNode(sum);
			cur = cur->next;
		}
		// 更新两个链表的遍历指针
		if (ptr1) ptr1 = ptr1->next;
		if (ptr2) ptr2 = ptr2->next;
	}
	// 最后一步是,如果较长的链表遍历完了,还有一个进位
	if (flag) cur->next = new ListNode(flag);
	return head;
}

标签:链表,ListNode,cur,相加,ptr2,力扣,进位,两数,指针
From: https://www.cnblogs.com/yaocy/p/16825181.html

相关文章