算法题——合并两条有序的链表

题目:给定两个已排序的链表,返回合并后的链表。

思路:将链表L2的每个结点插入到链表L1中,时间复杂度为O(m+n),m、n分别为两条链表的长度。

代码

 1 struct ListNode
 2 {
 3     int value;
 4     ListNode *next;
 5     ListNode(int v): value(v), next(NULL)
 6     {
 7     }
 8 };
 9
10 ListNode *mergeSortedList(ListNode *L1, ListNode *L2)
11 {
12     ListNode dummy(-1), *p1 = &dummy, *p2 = L2;  //L1的辅助头结点dummy,因为可能在头部插入
13     dummy.next = L1;
14     while(p1->next != NULL && p2 != NULL)  //停止条件,也包括了判断两个链表是否为空
15     {
16         if(p1->next->value >= p2->value)
17         {
18             L2 = p2->next;
19             p2->next = p1->next;
20             p1->next = p2;
21             p1 = p2;
22             p2 = L2;
23         }
24         else
25         {
26             p1 = p1->next;
27         }
28     }
29     if(p1->next == NULL)    //L2可能还有未处理的结点,直接加在L1尾部即可
30     {
31         p1->next = p2;
32     }
33
34     return dummy.next;
35 }

算法题——合并两条有序的链表

时间: 2024-08-27 12:13:20

算法题——合并两条有序的链表的相关文章

1.合并两个有序的链表

一.题目 合并两个有序的链表并使新链表也是有序排列. 二.算法实现 1 ListNode* Merge(ListNode* pHead1, ListNode* pHead2) 2 { 3 if (pHead1 == NULL) 4 return pHead2; 5 else if (pHead2 == NULL) 6 return pHead1; 7 ListNode *pNewHead = NULL, *pNode1 = NULL, *pNode2 = NULL; 8 if (pHead1->

Leetcode:Merge Two Sorted Lists 合并两个有序单链表

Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists. 代码如下: * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x

小算法:合并两个有序数组,合并之后仍然有序

1 /** 2 * 合并两个有序数组,合并后仍然有序 3 * @param a 要合并的数组A 4 * @param b 要合并的数组B 5 * @param c 合并后的数组C 6 */ 7 public static void merge(int a[] ,int b[],int c[]){ 8 int lengthA = a.length; 9 int lengthB = b.length; 10 11 int indexA = 0; 12 int indexB = 0; 13 int i

经典算法学习——合并两个有序链表

类似的,合并两个有序的数组或者链表也是剑指Offer中的经典题型.题目描述如下:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是按照递增排序的.我这里以合并链表来实现. 在这里,并不需要去创建一个新的链表,只要有三个节点指针就行,第一个节点指针Node1指向第一个链表,第二个节点指针Node2指向第二个链表,第三个节点指针Node3指向新的链表.简单的示意图如下: 当下一个节点在第一个链表中时,Node3指向该节点,Node1++,以此类推.直到某一个链表为空时,把另一个链表全部接

合并两个有序单链表

给出两个有序的单链表,将这两个单链表进行合并,合并出来的链表仍然是有序的. 比如给出链表1:1->3->6->7;链表2:2->4->5->8->9 合并后的链表为:1->2->3->4->5->6->7->8->9 代码展示如下(只给出实现部分) 结构体定义: typedef struct LinkNode { DataType data; struct LinkNode *next; }LinkNode,*pLi

链表:合并两个有序的链表

题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 解题思路 两种解法:递归和非递归 这个题目就是归并排序中的归并操作,将两个有序数组(链表)合并为一个有序的数组. 非递归: 第一个while循环,将 l1 和 l2 进行比较,谁小谁就合并到 listNode,直到 l1 或者 l2 为空 第二个while循环和第三个while循环,将 l1 或者 l2 剩下的节点合并到 listNode 最后返回的是 firstNode.next //头节点

算法题:合并两个有序的链表

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 题目:已知有两个有序的单链表,其头指针分别为head1和head2,实现将这两个链表合并的函数: Node* ListMerge(Node *head1,Node *head2) 这个算法很像我们排序算法中的归并排序,只能说“很像”,因为思想是一样的,但是这个与归并排序还是有区别的,区别如下:      1.归并排序是针对有序数组,而这里是有序链表:        2.归并排序排序的时间复杂度为o(nlogn),而这里的时间复杂度最坏情况下为O

LeetCode刷题--合并两个有序链表(简单)

题目描述 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1 -> 2 -> 4 ,1 -> 3 -> 4 输出:1 -> 1 -> 2 -> 3 -> 4 -> 4 方法 1:递归 思路 特殊的,如果 l1 或者 l2 一开始就是 null ,那么没有任何操作需要合并,所以我们只需要返回非空链表. 终止条件:两条链表分别名为 l1 和 l2,当 l1 为空或 l2 为空时结束 返回值:每一层

LeetCode 第21题 合并两个有序链表

/*将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4输出:1->1->2->3->4->4 Definition for singly-linked list. public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } */ 1 class Solutio