合并两个排序列表——剑指offer

题目:输入两个递增排序的列表,合并这两个链表使新的链表结点按照递增排序。

代码:

 1 #include<stdio.h>
 2 #include"malloc.h"
 3 typedef struct node
 4 {
 5     struct node *next;
 6     int data;
 7 }*ListNode;
 8
 9 //尾插法创建链表(不带头结点)
10 ListNode creatrList()
11 {
12     ListNode p = (ListNode)malloc(sizeof(ListNode));
13     ListNode s, q;
14     p->next = NULL;
15     q = p;
16     int x = 0;
17     scanf_s("%d", &x);
18     while (x != -1)
19     {
20         s = (ListNode)malloc(sizeof(ListNode));
21         s->next = NULL;
22         p->data = x;
23         p->next = s;
24         p = s;
25         scanf_s("%d", &x);
26     }
27     return q;
28 }
29 //合并两个链表
30 ListNode Merge(ListNode AList,ListNode BList)
31 {
32     if (AList->next == NULL)
33         return BList;
34     else if (BList->next == NULL)
35         return AList;
36     ListNode CList = NULL;
37     if (AList->data < BList->data)
38     {
39         CList = AList;
40          CList->next = Merge(AList->next,BList);
41     }
42     else
43     {
44         CList = BList;
45         CList->next = Merge(AList, BList->next);
46     }
47     return CList;
48 }
49
50 int main()
51 {
52     ListNode AList, BList,CList;
53     printf("创建A链表,以-1结束:");
54     AList = creatrList();
55     printf("创建B链表,以-1结束:");
56     BList = creatrList();
57     CList = Merge(AList, BList);
58     printf("合并后的列表为:");
59     while (CList->next!=NULL)
60     {
61         printf("%3d",CList->data);
62         CList = CList->next;
63     }
64     printf("\n");
65     return 0;
66
67 }
68 /*
69 创建A链表,以-1结束:1 2 3 5 6 7 -1
70 创建B链表,以-1结束:8 9 11 14 16 19 21 23 25 27 -1
71 合并后的列表为:  1  2  3  5  6  7  8  9 11 14 16 19 21 23 25 27
72 请按任意键继续. . .
73
74 创建A链表,以-1结束:-1
75 创建B链表,以-1结束:1 2 3 4 5 6 7 8 -1
76 合并后的列表为:  1  2  3  4  5  6  7  8
77 请按任意键继续. . .
78
79 创建A链表,以-1结束:1 2 3 4 5 6 7 8 -1
80 创建B链表,以-1结束:1 2 3 4 5 6 7 8 -1
81 合并后的列表为:  1  1  2  2  3  3  4  4  5  5  6  6  7  7  8  8
82 请按任意键继续. . .
83
84
85 */

时间: 2024-12-07 15:10:33

合并两个排序列表——剑指offer的相关文章

和为S的两个数字(剑指offer)指针O(n)

和为S的两个数字 参与人数:1186时间限制:1秒空间限制:32768K 通过比例:26.97% 最佳记录:0 ms|0K() 题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小的先输出. 思路:在递增序列中找两个数使得和为S,积最小,那么那么这两个数的差越大,积越小.我定义两个指针一个指在开头,一个指在结尾,用他们的和与S比较,如果大了,尾指针向前移动:如果小了

【剑指offer】Q17:合并两个排序的链表

def Merge(head1, head2): if head1 == None: return head2 if head2 == None: return head1 psuhead = ListNode(-1) tail = psuhead while head1 and head2: if head1.val < head2.val: cur = head1 head1 = head1.next else: cur = head2 head2 = head2.next cur.next

剑指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:合并两个排序的链表【25】

剑指Offer:合并两个排序的链表[25] 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目分析 每次都是比较箭头节点,把小节点连接到已经合并的链表之后,重复的执行此过程,最后如果那个链表已经走完,那就将另一个链表直接连接到合并的链表之后. Java题解 public static ListNode Merge(ListNode list1,ListNode list2) { if(list1==null) return list2;

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

合并两个排序的链表 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 用JavaScript非递归和递归方式都AC了. 非递归: function ListNode(x){ this.val = x; this.next = null; } function Merge(pHead1, pHead2) { if(!pHead1) { return !pHead2 ? null:pHead2; }else if(!pHead2) { retur

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

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

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

合并两个排序的链表 参与人数:1527时间限制:1秒空间限制:32768K 通过比例:27.96% 最佳记录:0 ms|8552K(来自  牛客708854号) 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目链接:http://www.nowcoder.com/practice/d8b6b4358f774294a89de2a6ac4d9337?rp=1&ru=/ta/coding-interviews&qru=/ta/codin

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

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

剑指Offer面试题:16.合并两个排序的链表

PS:这也是一道出镜率极高的面试题,我相信很多童鞋都会很眼熟,就像于千万人之中遇见不期而遇的人,没有别的话可说,唯有轻轻地问一声:“哦,原来你也在这里? ” 一.题目:合并两个排序的链表 题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的.例如输入下图中的链表1和链表2,则合并之后的升序链表如链表3所示. 链表结点定义如下,使用C#描述: public class Node { public int Data { get; set; } // 指向后一个节点 pu