LeetCode 两数相加

在leetcode上看了一个题目,对链表求和,之前是用字符串表示大数,进行求和,然后就写了下代码,顺便复习下链表的基本知识。
原题如下:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

链表结构如下:
 	 public class ListNode
    {
        public int val;
        public ListNode next;
        public ListNode(int x) { val = x; }
    }
把数组元素转换成链表
		public ListNode ConstructList(int[] array)
        {
            if(array == null)
            {
                return null;
            }
            ListNode root = null;

            //链表头部插入
            //for (int i = array.Length-1; i >= 0; --i)
            //{
            //    ListNode tmp = new ListNode(array[i]);
            //    tmp.next = root;
            //    root = tmp;               
            //}

            //链表尾插入
            ListNode tail = null;
            for (int i = 0; i < array.Length; ++i)
            {
                ListNode tmp = new ListNode(array[i]);
                if (root == null)
                {
                    root = tmp;
                    tail = root;
                }
                else
                {
                    tail.next = tmp;
                    tail = tmp;
                  
                }
            }
            return root;
        }
  对链表元素求和, 核心思想: 每次计算时除了链表两个节点的元素相加,还要考虑上一次的进位;
        public ListNode AddTwoNumbers(ListNode l1, ListNode l2)
        {
            ListNode newHead = null;
            if (l1 == null)
            {
                newHead = l2;
            }
            else if (l2 == null)
            {
                newHead = l1;
            }
            else
            {
                ListNode tmp1 = l1;
                ListNode tmp2 = l2;

                ListNode curNode = null;
                ListNode tail = null;

                while (tmp1 != null || tmp2 != null)
                {
                    int singleSum = 0;
                    if (tmp1 != null)
                    {
                        singleSum = tmp1.val;
                        tmp1 = tmp1.next;
                    }

                    if (tmp2 != null)
                    {
                        singleSum += tmp2.val;
                        tmp2 = tmp2.next;
                    }

                    int data0 = singleSum % 10;
                    int data1 = singleSum / 10;

                    if (curNode == null)
                    {
                        curNode = new ListNode(data0);
                    }
                    else
                    {
                        curNode.val += data0;
                        if (curNode.val >= 10)
                        {
                            data1 += 1;
                            curNode.val = curNode.val % 10;
                        }
                    }

                    if(newHead == null)
                    {
                        newHead = curNode;
                        tail = newHead;
                    }
                    else
                    {
                        tail.next = curNode;
                        tail = curNode;
                    }

                    if (data1 == 0) //不进位
                    {
                        curNode = null;
                    }
                    else //进了1位
                    {
                        curNode = new ListNode(data1);
                    }
                }

                if (curNode != null)
                {
                    if(newHead == null)
                    {
                        newHead = curNode;
                    }
                    else
                    {
                        tail.next = curNode;
                    }
                }
            }           
            return newHead;
        }

测试模块

 		public ToSum()
        {
            int[] array1 = new int[] { 1,8 };
            ListNode list1 = ConstructList(array1);
            PrintListNode(list1);


            int[] array2 = null;// new int[] { 0 };
            ListNode list2 = ConstructList(array2);

            PrintListNode(list2);

            ListNode res = AddTwoNumbers(list1, list2);
            PrintListNode(res);
        }

        public void PrintListNode(ListNode root)
        {
            ListNode tmp = root;
            while (tmp != null)
            {
                Console.Write(tmp.val + "\t");
                tmp = tmp.next;
            }
            Console.WriteLine("END");
        }

顺便复习一下链表翻转

  		ListNode ListReverse(ListNode newHead)
        {
            ListNode reverHead = null;
            ListNode currentNode = newHead;
            ListNode preCurNode = null;

            while (currentNode != null)
            {
                ListNode tmp = currentNode.next;
                if (tmp == null)
                {
                    reverHead = currentNode;
                }
                currentNode.next = preCurNode;
                preCurNode = currentNode;

                currentNode = tmp;
            }
            return reverHead;
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用,题目来源于力扣(LeetCode)的Add Two Numbers问题。根据引用,这是一个关于链表的问题,给定了两个非空的链表,表示两个非负的整数。这两个链表的每个节点都存储了一个逆序的数字,并且每个节点只能存储一位数字。我们需要将这两个数相加,并以相同形式返回一个表示和的链表。除了数字0以外,这两个数不会以0开头。根据引用,这是一道高频题,互联网大厂在笔试和面试中经常会考到这类问题。解决这道题需要基础的数据结构与算法知识,并锻炼解题能力。 问题:leetcode两数相加 回答:这个问题是力扣(LeetCode)上的Add Two Numbers问题,要求计算两个逆序表示的非负整数的和,并返回以相同形式表示的链表。它是一道高频题,经常在互联网大厂的笔试和面试中出现。为了解决这个问题,需要使用链表的基本操作,并且要注意进位的处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [LeetCode高频题2:两数相加](https://blog.csdn.net/weixin_46838716/article/details/125237688)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [leetcode两数相加](https://blog.csdn.net/weixin_43199244/article/details/115759341)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值