链表

python算法日记(链表系列)_leetcode 142. 环形链表 II

感情迁移 提交于 2020-03-08 10:43:56
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 说明:不允许修改给定的链表。 示例 1: 输入:head = [3,2,0,-4], pos = 1 输出:tail connects to node index 1 解释:链表中有一个环,其尾部连接到第二个节点。 示例 2: 输入:head = [1,2], pos = 0 输出:tail connects to node index 0 解释:链表中有一个环,其尾部连接到第一个节点。 示例 3: 输入:head = [1], pos = -1 输出:no cycle 解释:链表中没有环。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/linked-list-cycle-ii 方法一:利用集合(set)的无序的不重复元素序列的特性。把visited的节点存在set里,延用环形链表 I的做法 # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next

力扣的删除排序链表中的重复元素解法 (Python3)

倾然丶 夕夏残阳落幕 提交于 2020-03-08 10:19:50
力扣的删除排序链表中的重复元素解法 题目描述: 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3->3 输出: 1->2->3 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 参考程序1: """ Definition of ListNode class ListNode(object): def __init__(self, val, next=None): self.val = val self.next = next """ class Solution : """ @param result: A ListNode @return: A ListNode """ def deleteDuplicates ( self , result ) : if result is None : return result record = set ( [ result . val ] ) cur , pre = result . next , result while cur : if

Task7:合并两个有序链表

╄→尐↘猪︶ㄣ 提交于 2020-03-08 09:58:44
题目 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 解题 class Solution : def mergeTwoLists ( self , l1 : ListNode , l2 : ListNode ) - > ListNode : prehead = ListNode ( - 1 ) prev = prehead while l1 and l2 : if l1 . val <= l2 . val : prev . next = l1 l1 = l1 . next else : prev . next = l2 l2 = l2 . next prev = prev . next # exactly one of l1 and l2 can be non-null at this point, so connect # the non-null list to the end of the merged list. prev . next = l1 if l1 is not None else l2 return prehead . next 作者:LeetCode 链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/solution/he-bing-liang

面试题06. 从尾到头打印链表

自作多情 提交于 2020-03-08 06:51:12
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 思路 从头到尾将链表打印到数组中,返回反转后的结果即可。 # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution : def reversePrint ( self , head : ListNode ) - > List [ int ] : res = [ ] while head : res . append ( head . val ) head = head . next return res [ : : - 1 ] 来源: 力扣leetcode 来源: CSDN 作者: 海苔饭 链接: https://blog.csdn.net/weixin_43455338/article/details/104711071

LeetCode- 面试题24. 反转链表

感情迁移 提交于 2020-03-08 06:38:23
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 限制: 0 <= 节点个数 <= 5000 复习: #include <iostream> using namespace std; //p1->p2->p3->p4; struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; class Solution { public: ListNode* reverseList(ListNode* head) { ListNode *p1,*p2,*p3; p1 = NULL; p2 = head; while(p2!=NULL){ p3 = p2->next; p2->next = p1; p1 = p2; p2 = p3; } return p1; } }; int main(){ ListNode *head = new ListNode(0); ListNode *tmp = head; for(int i=1;i<=5;i++){ ListNode *temp = new ListNode(i); tmp->next = temp; tmp =

LeetCode 2——两数相加

杀马特。学长 韩版系。学妹 提交于 2020-03-08 03:51:49
1. 题目 2. 解答 循环遍历两个链表 若两个链表都非空,将两个链表结点的值和进位相加求出和以及新的进位 若其中一个链表为空,则将另一个链表结点的值和进位相加求出和以及新的进位 然后将每一位的和添加到新链表中。 如果 有一个链表为空,且此时进位为 0 ,我们则只需要将非空链表后面的值复制到新链表即可,可以通过将非空链表的剩余结点直接接在新链表后面来实现。 如果最后两个链表同时为空,我们还要考虑此时是否有进位, 若有进位,进位即为最后一位的和 ,然后,让链表尾结点指向 NULL 即可。 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode *head = new ListNode(0); // 建立哨兵结点 ListNode *temp = head; int carry = 0; // 保留进位 int sum = 0; while(l1 || l2) { if (l1 && l2)

【leetcode 刷题日记】07-合并两个有序链表(C++)

假如想象 提交于 2020-03-08 02:59:49
合并两个有序链表 题目 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 思路 创建一个虚拟头节点,用指针cur指向头节点,然后和l1、l2比较,cur->next指向其中较小的一个。 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public : ListNode * mergeTwoLists ( ListNode * l1 , ListNode * l2 ) { if ( l1 == NULL && l2 == NULL ) return NULL ; ListNode * dummyHead = new ListNode ( 0 ) ; ListNode * cur = dummyHead ; while ( l1 != NULL || l2 != NULL ) { if ( l1 == NULL || ( l2 != NULL && ( l1 - > val >= l2 - >

合并两个有序链表

空扰寡人 提交于 2020-03-07 23:56:42
题目描述 (来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/merge-two-sorted-lists) 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例:输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 代码参考这里 迭代法 当输入两个链表l1和l2时,由于都是有序链表,所以在每次合并时,只需要找出当前两个链表中表头最小的一个作为表头即可,最终得到按顺序排列的链表。 使用递归法不断调用函数,使得留下当前两个链表表头中元素最小的一个,作为固定的顺序,之后再将其他元素重新作为变量调用函数,直到将两个链表中的所有元素都进行排序,得出从小到大的顺序。 struct ListNode * mergeTwoLists ( struct ListNode * l1 , struct ListNode * l2 ) { if ( ! l1 ) return l2 ; if ( ! l2 ) return l1 ; if ( l1 -> val < l2 -> val ) { //若当前l1的元素较小,则留下此元素,对下一个元素进行比较,确定当前元素之后的顺序 l1 -> next = mergeTwoLists ( l1 -> next , l2 ) ;

笔记--循环链表

蹲街弑〆低调 提交于 2020-03-07 23:55:14
循环链表是另一种形式的链式存储结构形式。 循环单链表:将表中尾结点的指针域改为指向表头结点,整个链表形成一个环。由此从表中任一结点出发均可找到链表中其他结点。结点类型与非循环单链表的相同。 循环双链表:形成两个环。结点类型与非循环双链表的相同。 1.循环单链表 (图片来自中国大学MOOC) 与非循环单链表相比,循环单链表: 链表中没有空指针域 p所指结点是尾结点的条件: p->next==L 2.循环双链表 (图片来自中国大学MOOC) 与非循环双链表相比,循环双链表: 链表中没有空指针域 p所指结点为尾结点的条件: p->next==L 一步操作即L->prior可以找到尾结点 看一个例子: 问题描述: 设计判断带头结点的循环双链表L(含两个以上的结点)是否对称相等的算法。 算法思路: 设置两个数据结点p和q,p从左向右扫描链表 L ,q从右向左扫描链表 L 若p和q对应的 data 域不相等,则退出循环,说明该链表不对称 否则继续比较,直到p与q相等(数据结点个数为奇数)或p的下一个结点为 *q (数据结点为偶数)为止 代码实现: # include <stdio.h> # include <stdlib.h> # define MaxSize 100 typedef int ElemType ; typedef struct DNode * DLinkList ;

合并两个有序链表——python

眉间皱痕 提交于 2020-03-07 22:16:29
题目描述 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 递归解法 class Solution : def mergeTwoLists ( self , l1 : ListNode , l2 : ListNode ) - > ListNode : if ( not l1 ) or ( not l2 ) : return l1 or l2 if l1 . val < l2 . val : l1 . next = self . mergeTwoLists ( l1 . next , l2 ) return l1 else : l2 . next = self . mergeTwoLists ( l1 , l2 . next ) return l2 运行结果 非递归解法 class Solution : def mergeTwoLists ( self , l1 : ListNode , l2 : ListNode ) - > ListNode : head = ListNode ( None ) p = head while l1 and l2 : if l1 . val <= l2 . val : p . next = l1 l1 = l1 .