两个有序链表的合并

对于两个有序链表合并成一个新的有序链表的代码很简单,但是要注意一些测试用例:

比如说一个为空链表;两个链表不一样长,肯定最后有一个链表要单独的挂到结果链表中去的。

 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. ]数据结构:单链表之判断两个链表是否相交及求交点(带环、不带环)

    1.判断两个链表是否相交,若相交,求交点.(假设链表不带环) 两个指针同时指向两个链表,分别依次往后遍历链表到最后一个节点,如指针的值相同(即节点地址相同),反之没有交点. int IsCross(N ...

  2. 链表问题10——两个单链表生成相加链表

    题目 假设链表中每一个节点的值都在0-9之间,链表整体代表一个整数. 给定两个这种链表的头节点,请生成代表两个整数相加值的结果链表. 链表1 链表2 生成的新链表 9->3->7 6-&g ...

  3. 37. 两个链表的第一个公共结点

    为什么80%的码农都做不了架构师?>>>    题目:输入两个链表,找出它们的第一个公共结点. 思路:先遍历两个链表得出它们各自的长度,然后让长链表先走,直到长度和短的一致,然后两个 ...

  4. 【剑指Offer专题】链表系列:从尾到头打印链表、反转链表、回文链表、合并两个排序的链表(C++和Python实现)...

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 剑指Offer(三):从尾到头打印链表 输入一个链表的头节点,从尾到头反过来返回每 ...

  5. [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 ...

  6. 判断两个链表是否相交

    方法:获得两个链表的长度,获得长度的差值len,然后首先遍历较长的链表len次,然后再同时遍历两个链表,如果有相同部分,两个链表就相交,如果没有,则不相交,即没有公共部分. 代码: #include ...

  7. 常考数据结构与算法:两个链表的第一个公共结点

    题目描述 输入两个链表,找出它们的第一个公共结点.(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的) 面试的时候碰到这道题,很多应聘者的第一反应就是蛮力法:在第 ...

  8. 《剑指offer》-- 两个链表的第一个公共结点、链表中环的入口结点、删除链表中的重复结点

    一.两个链表的第一个公共结点: 1.题目: 输入两个链表,找出它们的第一个公共结点. 2.解题思路: (1)第一种:找出两个链表的长度,然后让长的链表先走两个链表的长度差,接着两个链表一起走. (2) ...

  9. 《剑指offer》-- 链表中倒数第k个节点、反转链表、合并两个排序的链表

    一.链表中倒数时第k个节点: 1.题目: 输入一个链表,输出该链表中倒数第k个结点. 2.解题思路:单链表具有单向移动的特性. (1)第一种:先遍历链表,算出链表节点数count,第二次直接遍历到第c ...

最新文章

  1. python使用gevent实现协程
  2. C#--封装、继承、多态
  3. 关于两台路由器之间的OSPF邻居关系问题!
  4. hyperion高光谱参数_[ENVI] 珠海一号高光谱数据处理
  5. flutte的第一个hello world程序
  6. 07-图6 旅游规划 (25 分)
  7. 1185 城市名排序
  8. Android Gallery组件实现循环显示图像
  9. 用RtlAdjustPrivilege来调整进程权限(VB6.0代码)
  10. pcie16x能插1x的卡嘛?_存储先锋,雷克沙633x TF卡评测
  11. 绕过IceSword文件检测的Trojan.Win32.Mnless.zpc/ojj6erv.sys
  12. matlab从无到有系列(二):矩阵运算基础
  13. springBoot接入阿里云oss
  14. 高通efs_了解EFS
  15. 下班后10条最佳放松方法
  16. html小总结:表格立体效果的实现.
  17. 25w年薪!这个行业好起来了!
  18. 用CNN做在NLP句子分类
  19. SQL的EXISTS双重否定
  20. 华为电脑系统linux下载,华为操作系统openeuler去哪下载?官方下载ISO安装包

热门文章

  1. mysql外键_MySQL外键约束(FOREIGN KEY)
  2. eclipse插件之——PropertiesEditor
  3. 软考的一些心得分享, 写在信息系统项目管理师通过之后
  4. Spring Boot + Activiti 在浏览器显示工作流图
  5. 读书笔记-大型网站技术架构
  6. python读取指定字节_python读取指定字节及位置的文件内容
  7. 当html里语义化,HTML5语义化
  8. java随机输出_用java随机输出汉字
  9. Xtrabackup远程备份+限速
  10. vue ---- 监听器