版权声明:本文为博主原创文章,未经博主允许不得转载。
一、问题描述
You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
意思是将给你两个非空链表代表两个非负整数。并且数字是以倒序存储的,每个节点只包含一个数字。求这两个非负整数的和并以链表的形式返回,可以假设这两个数字没有包含任何前导零,除非这个数字本身就是零。
二、生词
non-negative adj.非负的
store vt. /stɔː/贮藏,储存
pseudocode n./'sju:dəʊˌkəʊd/ 伪代码
三、样例及说明
/**题目预定义好的节点类 * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */
四、解题思路及代码
我一开始把ListNode理解为一个容器,竟然用增强for循环去迭代。。。醉辽,所以要看清代码!!!
本题用模拟数学上两数相加即可解出。
伪代码:
- 初始化一个返回链表的虚拟头
- 初始化p,q,curr分别代表两个链表的头节点l1,l2及当前所在的节点
- 初始化一个整型变量代表数学中的进位
- 一个while循环,功能是算每个位上的和、更新进位和链表
- 判断进位的最后状态,如果大于零则更新链表
- 最后返回虚拟头的下一个节点,也就是结果链表的根节点
1 class Solution { 2 3 public ListNode addTwoNumbers(ListNode l1, ListNode l2) { //注意题目要求返回的是一个节点!也就是说只要把链表的根节点返回就好 4 ListNode head = new ListNode(0); 5 ListNode p = l1, q = l2, curr = head ; 6 int carry = 0; 7 while(p!=null || q!=null) { 8 int x = p!=null ? p.val : 0; 9 int y = q!=null ? q.val : 0; 10 int sum = x + y + carry; 11 carry = sum/10 ; 12 curr.next = new ListNode(sum%10) ; 13 curr = curr.next ; 14 if(p!=null) p = p.next; 15 if(q!=null) q = q.next; 16 } 17 if(carry > 0) { 18 curr.next = new ListNode(carry) ; 19 } 20 return head.next; 21 } 22 }
以上代码的时间复杂度是O(max(m,n)),m和n分别表示以节点l1、l2为根节点的链表长度。