剑指offer面试题17:合并两个排序的链表

题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点人是按照递增排序的。
解题思路:两个链表分别都已经是有序的了,遍历链表的时候只要比较两个链表当前位置大小,取出最小的添加到新链表中。

可以有递归、循环两种方式来解决。

  1 package Solution;
  2
  3
  4 public class No17MergeSortedLists {
  5
  6     public static class ListNode {
  7         int data;
  8         ListNode next;
  9
 10         public ListNode() {
 11
 12         }
 13
 14         public ListNode(int value, ListNode next) {
 15             this.data = value;
 16             this.next = next;
 17         }
 18     }
 19
 20     public static void print(ListNode head) {
 21         if (head == null)
 22             System.out.println("当前链表为空");
 23         while (head != null) {
 24             System.out.print(head.data + ",");
 25             head = head.next;
 26         }
 27         System.out.println();
 28     }
 29    //递归方式合并两个排序的链表
 30     public static ListNode merge(ListNode head1, ListNode head2) {
 31         if (head1 == null)
 32             return head2;
 33         if (head2 == null)
 34             return head1;
 35         ListNode mergedHead = null;
 36         if (head1.data < head2.data) {
 37             mergedHead = head1;
 38             mergedHead.next = merge(head1.next, head2);
 39         } else {
 40             // 如果两个节点的值相同,返回第二个
 41             mergedHead = head2;
 42             mergedHead.next = merge(head1, head2.next);
 43         }
 44         return mergedHead;
 45     }
 46     //依次比较两个链表的当前结点,添加到新链表中
 47     public static ListNode mergeSortedList(ListNode head1, ListNode head2) {
 48         if (head1 == null)
 49             return head2;
 50         if (head2 == null) {
 51             return head1;
 52         }
 53         ListNode newHead = null;
 54         ListNode newNode = null;
 55         ListNode list1 = head1;
 56         ListNode list2 = head2;
 57         // 找到新的头结点
 58         if (list1.data < list2.data) {
 59             newHead = list1;
 60             list1 = list1.next;
 61         } else {
 62             newHead = list2;
 63             list2 = list2.next;
 64         }
 65         newNode = newHead;
 66         // 合并其他节点
 67         while (list1 != null && list2 != null) {
 68             if (list1.data < list2.data) {
 69                 newNode.next = list1;
 70                 list1 = list1.next;
 71             } else {
 72                 newNode.next = list2;
 73                 list2 = list2.next;
 74             }
 75             newNode = newNode.next;
 76         }
 77         // 有一条链表合并完,则把剩下的另一条链表直接合并到新链条末尾
 78         if (list1 == null) {
 79             newNode.next = list2;
 80         } else {
 81             newNode.next = list1;
 82         }
 83         return newHead;
 84     }
 85
 86     public static void main(String[] args) {
 87         ListNode node1 = new ListNode(7, null);
 88         ListNode node2 = new ListNode(4, node1);
 89         ListNode node3 = new ListNode(3, node2);
 90         ListNode head1 = new ListNode(1, node3);
 91
 92         ListNode node5 = new ListNode(8, null);
 93         ListNode node6 = new ListNode(6, node5);
 94         ListNode node7 = new ListNode(4, node6);
 95         ListNode head2 = new ListNode(2, node7);
 96         // 测试含有相同值得两个对各节点的链表的合并,合并后head1和merged1都指向合并后的新链表的头结点
 97         // ListNode merged1 = merge(head1, head2);
 98         // print(merged1);
 99         // // 测试含有一个null头指针的链表的合并,由于head2指向上一步合并后的新链表的第二个节点,所以输出的节点个数为总个数-1
100         // print(merge(head2, null));
101         // // 测试两个链表中只有一个节点
102         // print(merge(null, new ListNode(10, null)));
103         ListNode merged1 = mergeSortedList(head1, head2);
104         print(merged1);
105         // 测试含有一个null头指针的链表的合并,由于head2指向上一步合并后的新链表的第二个节点,所以输出的节点个数为总个数-1
106         print(mergeSortedList(head2, null));
107         // 测试两个链表中只有一个节点
108         print(mergeSortedList(null, new ListNode(10, null)));
109     }
110
111 }
时间: 2024-10-06 08:57:47

剑指offer面试题17:合并两个排序的链表的相关文章

剑指offer面试题17——合并两个排序的链表

题目1519:合并两个排序的链表 题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则.(hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为两个整数n和m(0<=n<=1000, 0<=m<=1000):n代表将要输入的第一个链表的元素的个数,m代表将要输入的第二个链表的元素的个数.下面一行包括n个数t(1<=t<=1000000):代表链表一中的元素.接

剑指offer之面试题17合并两个排序的链表

问题描述: 输入两个递增的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的. 实现代码如下: #include <stdio.h> #include <stdlib.h> #include <stdbool.h> struct List{ int date; struct List *next; }; struct List* doMergeList(struct List *P1head,struct List *P2head){ if(P1head==NU

剑指offer 面试题17—合并两个排序的链表

题目: 输入两个递增排序的链表,合并这两个链表并使得新链表中的节点仍然是按照递增排序的. 基本思想: 当我们得到两个链表中值较小的头结点并把它连接到已经合并的链表之后,两个链表剩余的节点依然是排序的,因此合并的步骤和之前的而不周是一样的.这就是典型的递归的过程. #include <iostream> using namespace std; typedef int ElemType;//数据类型模板 typedef struct Node//结点 { ElemType data; struc

剑指offer_面试题17_合并两个排序的链表(两种思维)

题目:输入两个递增排序的链表,合并这两个链表,并使新链表中的结点仍然是按照递增排序的. 第一种思维:合并两个排序的链表,类似于合并两个排序数组,所不同的仅是一个用链表保存数据,一个用数组保存数据. 算法如下:(下面的算法前提是:头结点 不是 链表的第一个数据节点.) /**方法一:合并两个排序链表,使用了新创建的链表来保存,没有改动两个原始链表*/ ListNode *merge_tow_list(ListNode *pHead1,ListNode *pHead2) { if(NULL == p

剑指offer系列源码-合并两个排序的链表

题目1519:合并两个排序的链表 时间限制:1 秒内存限制:128 兆特殊判题:否提交:1309解决:615 题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. (hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第一行为两个整数n和m(0<=n<=1000, 0<=m<=1000):n代表将要输入的第一个链表的元素的个数,m代表将要输入的第二个链表的元素的个数. 下面

剑指offer系列10:合并两个排序的链表

我拿到这个题的时候举的例子是链表1:1.3.5.7和链表2:2.4.6.8.我的思路是以:1为基础,将表2的每个结点插入表1.也就是说我一次性是要给新建立的链表中加入两个元素,分别是两个原始链表的头结点.这个思路我做了半天头脑一片混乱,中间指针实在不知道怎么弄了.于是我去睡了一觉,哈哈,我大概是这个世界上最会逃避的人了…… 看了答案使用了递归的方法,其实我做的时候我有想到要用递归,但是没用的原因是我一般写代码不喜欢用递归,原因有两个,一个是递归容易死循环,一个是递归的复杂度太高.但这道题真的太适

《剑指Offer》题目:合并两个排序的链表

题目描述:输入两个单调递增的链表list1,list2,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目分析: 1.对于链表题目,首先考虑边界情况,即链表为空的情况,提升代码的鲁棒性. 2.合并完一个结点后,剩余的链表仍然是有序的,再合并下一个结点时的过程是一样的,这是一种递归的思想,因此采用递归来合并. Java代码: public class MergeSortedList { public ListNode Merge(ListNode list1,ListNod

【剑指Offer】16、合并两个排序的链表

题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 解法一:使用ArrayList 1 public static ListNode Merge(ListNode list1,ListNode list2) { 2 if(list1==null||list2==null){ 3 if(list1==null){ 4 return list2; 5 }else{ 6 return list1; 7 } 8 } 9 ArrayList<ListNo

剑指offer(16)合并两个排序的链表

题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 解题代码: /*function ListNode(x){ this.val = x; this.next = null; }*/ function Merge(pHead1, pHead2) { // write code here if(pHead1 == null && pHead2 == null){ return null; } if(pHead1 == null){ ret

面试题 17:合并两个排序的链表

题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按 照递增排序的. 两个指针指向两个链表的头结点,取其中值小的作为新链表的头结点,和之前的结点串联,如此递归. 注意用例: 两个链表都为null: 其中一个链表为null: 两个链表有多个结点,有相同的值,不同的值. package offer; /*面试题 17:合并两个排序的链表 题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按 照递增排序的.*/ public class Problem17 { st