[链表]同时遍历两个链表
两个有序链表的合并
对于两个有序链表合并成一个新的有序链表的代码很简单,但是要注意一些测试用例:
比如说一个为空链表;两个链表不一样长,肯定最后有一个链表要单独的挂到结果链表中去的。
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {if(l1 == NULL)return l2;if(l2 == NULL)return l1;ListNode dummy(-1);ListNode *p = &dummy;while(l1 != NULL && l2 != NULL){if(l1->val < l2->val){p->next = l1;p = p->next;l1 = l1->next;p->next = NULL;}else{p->next = l2;p = p->next;l2 = l2->next;p->next = NULL;}}//whilep->next = l1 == NULL ? l2 : l1;return dummy.next;}
注意程序中用到了一个头结点,这个头结点就是为了链表插入的方便,真正返回的时候还是放回的dummy.next。
K个有序链表的合并
这个问题当然可以利用上面的合并两个有序链表的方法,把前两个合并成一个,然后再同第三个合并,这样一次下去。但是这让我们想起来归并算法,把非常小的子问题首先合并,然后再合并中等的问题,最后再把中等的问题合并成大的问题。这样的时间复杂度要比一次合并小得多。所以利用归并的思想,设计代码如下:
ListNode* mergeKLists(vector<ListNode*>& lists)
{int n = lists.size();if(n == 0)return NULL;while(n > 1){int k = (1 + n) / 2;for(int i = 0; i < n / 2; i++){lists[i] = mergeTwoLists(lists[i], lists[i + k]);}n = k;}return lists[0];
}
这里利用归并的时候,把整个的问题划分还是有一定的技巧的。
int k = (n + 1) / 2;
1.如果n是偶数,那么k是后半部分的开始,并且前面直接就是前半部分。
2.如果n是奇数,那么k是后半部分的开始,但是前面隔着一个n/2这个元素,再往前才是对应的前半部分。
转载于:https://www.cnblogs.com/stemon/p/4683373.html
[链表]同时遍历两个链表相关推荐
- ]数据结构:单链表之判断两个链表是否相交及求交点(带环、不带环)
1.判断两个链表是否相交,若相交,求交点.(假设链表不带环) 两个指针同时指向两个链表,分别依次往后遍历链表到最后一个节点,如指针的值相同(即节点地址相同),反之没有交点. int IsCross(N ...
- 链表问题10——两个单链表生成相加链表
题目 假设链表中每一个节点的值都在0-9之间,链表整体代表一个整数. 给定两个这种链表的头节点,请生成代表两个整数相加值的结果链表. 链表1 链表2 生成的新链表 9->3->7 6-&g ...
- 37. 两个链表的第一个公共结点
为什么80%的码农都做不了架构师?>>> 题目:输入两个链表,找出它们的第一个公共结点. 思路:先遍历两个链表得出它们各自的长度,然后让长链表先走,直到长度和短的一致,然后两个 ...
- 【剑指Offer专题】链表系列:从尾到头打印链表、反转链表、回文链表、合并两个排序的链表(C++和Python实现)...
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 剑指Offer(三):从尾到头打印链表 输入一个链表的头节点,从尾到头反过来返回每 ...
- [LeetCode] Intersection of Two Linked Lists 求两个链表的交点
Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...
- 判断两个链表是否相交
方法:获得两个链表的长度,获得长度的差值len,然后首先遍历较长的链表len次,然后再同时遍历两个链表,如果有相同部分,两个链表就相交,如果没有,则不相交,即没有公共部分. 代码: #include ...
- 常考数据结构与算法:两个链表的第一个公共结点
题目描述 输入两个链表,找出它们的第一个公共结点.(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的) 面试的时候碰到这道题,很多应聘者的第一反应就是蛮力法:在第 ...
- 《剑指offer》-- 两个链表的第一个公共结点、链表中环的入口结点、删除链表中的重复结点
一.两个链表的第一个公共结点: 1.题目: 输入两个链表,找出它们的第一个公共结点. 2.解题思路: (1)第一种:找出两个链表的长度,然后让长的链表先走两个链表的长度差,接着两个链表一起走. (2) ...
- 《剑指offer》-- 链表中倒数第k个节点、反转链表、合并两个排序的链表
一.链表中倒数时第k个节点: 1.题目: 输入一个链表,输出该链表中倒数第k个结点. 2.解题思路:单链表具有单向移动的特性. (1)第一种:先遍历链表,算出链表节点数count,第二次直接遍历到第c ...
最新文章
- python使用gevent实现协程
- C#--封装、继承、多态
- 关于两台路由器之间的OSPF邻居关系问题!
- hyperion高光谱参数_[ENVI] 珠海一号高光谱数据处理
- flutte的第一个hello world程序
- 07-图6 旅游规划 (25 分)
- 1185 城市名排序
- Android Gallery组件实现循环显示图像
- 用RtlAdjustPrivilege来调整进程权限(VB6.0代码)
- pcie16x能插1x的卡嘛?_存储先锋,雷克沙633x TF卡评测
- 绕过IceSword文件检测的Trojan.Win32.Mnless.zpc/ojj6erv.sys
- matlab从无到有系列(二):矩阵运算基础
- springBoot接入阿里云oss
- 高通efs_了解EFS
- 下班后10条最佳放松方法
- html小总结:表格立体效果的实现.
- 25w年薪!这个行业好起来了!
- 用CNN做在NLP句子分类
- SQL的EXISTS双重否定
- 华为电脑系统linux下载,华为操作系统openeuler去哪下载?官方下载ISO安装包