链表相关题目总结



一、两数相加:

  

  由于是刷的第一题,先写下:

  本题是两个链表相加,方法是生成一个新的链表(其实是一个节点不断指向下一个节点,这样依次连起来的)去存储这个两个的和。

  首先生成一个新的链表h,h是头指针;然后再让指针t指向h。

    新建私有方法,该方法的作用是返回链表的有效数据,并让链表指向后继节点。即p好p->next指向相同的地址。

  然后建立一个进位标志carry,让sum = x + y  + carry:,将sum %10作为新节点node的初始值。让node和*t指向相同的地址,记住*t是t解引用,t指向的值是h,所以就是h和node指向相同的地址。

然后让t指向node->next的地址。

  

 1 class Solution {
 2
 3 public:
 4     ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
 5         ListNode* h = NULL,**t = &h; //t指向h,h指向NULL
 6         int x = 0,y = 0,carry = 0,sum = 0;
 7         while(l1 != NULL || l2 != NULL){
 8             x = getValueAndMoveNext(l1);
 9             y = getValueAndMoveNext(l2);
10             sum = x + y + carry;
11             ListNode* node = new ListNode(sum%10);
12             *t = node; //h和node指向同一个地址
13             t = &node->next; //node->next是一个指针,它取指针的地址给t
14             carry = sum /10;
15         }
16         if(carry > 0){
17             ListNode* node = new ListNode(carry % 10);
18             *t = node;
19         }
20         return h;
21     }
22 private:
23     int getValueAndMoveNext(ListNode* &l){ //l是一个ListNOde指针的引用
24         int v = 0;
25         if(l != NULL){
26         v = l->val;
27         l = l->next;
28         }
29
30         return v;
31     }
32
33 };


  

原文地址:https://www.cnblogs.com/ccpang/p/11428380.html

时间: 2024-11-08 23:35:01

链表相关题目总结的相关文章

剑指offer题目系列三(链表相关题目)

本篇延续上一篇剑指offer题目系列二,介绍<剑指offer>第二版中的四个题目:O(1)时间内删除链表结点.链表中倒数第k个结点.反转链表.合并两个排序的链表.同样,这些题目并非严格按照书中的顺序展示的,而是按自己学习的顺序,每个题目包含了分析和代码. 9.O(1)时间内删除链表结点 题目: 在O(1)时间内删除链表结点.给定单链表的头指针和一个结点指针,定义一个方法在O(1)时间内删除该结点. 单链表的定义如下: 解答: 单向链表删除一个结点,最直观的想法是从链表的头结点开始顺序遍历查找要

leetcode 单链表相关题目汇总

  leetcode-19-Remove Nth From End of List—移除链表中倒数第n个元素 leetcode-21-Merge Two Sorted Lists—两个已排序链表归并 leetcode-23-Merge k Sorted Lists—k个已排序链表归并 leetcode-24-Swap Nodes in Pairs—链表中元素两两一组交换 leetcode-25-Reverse Nodes in K-Group—链表中元素k个一组逆序 leetcode-61-Ro

链表相关题目-leetcode简单

目录 1. 合并两个有序链表 2. 删除排序链表中的重复元素 3. 环形链表 4.相交链表 5.移除链表元素 6.反转链表 7.回文链表 8.删除链表中的节点 9.链表的中间节点 1. 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 方法一.利用递归思想 class Solution { public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if(l1==null

【常用算法思路分析系列】链表相关高频题集

本文是[常用算法思路分析系列]的第四篇,总结链表相关的高频题目和解题思路.本文分析如下几个问题:1.环形链表的差值问题:2.只能访问单个结点的删除问题:3.链表的分化:4.打印两个链表的公共部分:5.把链表的每k个结点逆序:6.删除链表中指定结点:7.判断链表是否为回文结构:8.复杂链表的复制:9.判断链表是否有环:10.判断两个无环链表是否相交:11.判断两个有环链表是否相交:12.判断两个链表(状态未定)是否相交. 本系列前三篇导航: [常用算法思路分析系列]排序高频题集 [常用算法思路分析

链表相关算法题总结 1

链表题目对算法的要求度不高,但实际写的过程中需要注意语言细节,考虑精细度的地方很多. 1.链表结构与基本操作 1.1 添加节点 一般情况: cur ->next = prev ->next; prev ->next = cur; 表头插入: cur ->next = head; head = cur; 1.2删除节点 一般情况:(已知待删除节点的前驱节点) ListNode* temp = prev->next; prev->next = prev->next-&

LeetCode: Palindrome 回文相关题目

LeetCode: Palindrome 回文相关题目汇总 LeetCode: Palindrome Partitioning 解题报告 LeetCode: Palindrome Partitioning II 解题报告 Leetcode:[DP]Longest Palindromic Substring 解题报告 LeetCode: Valid Palindrome 解题报告

九度 Online Judge 之《剑指 Offer》一书相关题目解答

前段时间准备华为机试,正好之前看了一遍<剑指 Offer>,就在九度 Online Judge 上刷了书中的题目,使用的语言为 C++:只有3题没做,其他的都做了. 正如 Linus Torvalds 所言“Talk is cheap, show me the code!",详见托管在 Github 的源码:点击打开链接(核心部分有注释). 难度总结:有些可以不必要像书中那样保存中间结果,直接输出,也就可以不使用书中的算法:有些题目在书中题目的基础上加了更多的要求,也更难实现一点.

链表相关的leetcode重要题目

Leetcode 92:反转链表II 解决这道题需要三个步骤: 找到需要反转的第一个节点.可以通过头节点前进m-1步,找到反转开始的位置. 将需要反转的部分进行反转.参考Leetcode 206:反转链表. 将反转部分与剩余部分进行链接.其中分为两种情况,m=1与m>1.当m=1时,仅需要将反转部分反转前的头节点的next指向反转部分反转前尾节点的后继,新链表的头节点为反转部分反转前的尾节点.当m>1时,还需要将反转部分反转前头节点的前驱的next指向反转部分反转前的末节点,新链表的头节点仍为

剑指offer——链表相关问题总结

首先统一链表的数据结构为: struct ListNode { int val; struct ListNode *next; ListNode(int x) :val(x), next(NULL) {} }; 题目一:从尾到头打印链表:输入一个链表.从尾到头打印链表每一个节点的值. 分析: 难点在于链表仅仅有指向后继的指针,没有指向前驱的指针. 转换思路.结合栈后进先出的特点,能够遍历链表,依次将数据元素存入栈中,然后再依次出栈,即为从尾到头的顺序. vector<int> printLis